2017-02-24 93 views
0

我想實現這樣的:FTP文件 - FileListFilter只得到最新的文件

Arrays.sort(files, new Comparator<File>(){ 
    public int compare(File f1, File f2) 
    { 
     return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified()); 
    } }); 

的問題是,我有FTPFile,而不是File,和FTPFile只有getTimestamp()。

我該如何實現一個過濾器來下載基於修改日期的最新文件?

或者我如何調整我顯示的與FTPFile而不是File一起使用的示例?

它必須是這個樣子:

public class NewestFileOnlyFilter implements FileListFilter<FTPFile> { 
    //logic to return only the newest file. 
} 

回答

1

這裏是你如何能做到這一點:

public class NewestFileOnlyFilter implements FileListFilter<FTPFile> { 

    @Override 
    public List<FTPFile> filterFiles(FTPFile[] files) { 
    return Arrays.stream(files)           // 1 
       .max(Comparator.comparing(FTPFile::getTimestamp))  // 2 
       .map(Collections::singletonList)      // 3 
       .orElse(Collections.emptyList());      // 4 
    } 
} 

一些澄清的參考線:

  1. 表示形式的數組一個簡化其進一步處理的流;
  2. 主要步驟:

    • 搜索與max方法的流的最大元素;
    • 提供max方法與比較器Comparator.comparing;
    • 爲比較器提供返回比較鍵的功能 - getTimestamp在這種情況下,我們將文件與它們的修改時間進行比較。
  3. 將搜索結果(具有最大時間戳的文件)包裝到具有單個元素(如果有的話)的列表中;

  4. 否則返回空列表。
    這不太可能發生在FileListFilter內,但我們仍然處理這種情況。
0

時間戳(一般)的最後修改時間 - 看到的javadoc ...

/*** 
* Returns the file timestamp. This usually the last modification time. 
* 
* @return A Calendar instance representing the file timestamp. 
***/ 
public Calendar getTimestamp() 

Calendar實現Comparable

0

你可以這樣做:

public int compare(File f1, File f2) 
{ 
     Calendar dateOfmyFile=f1.getTimestamp(); 
     Date dateF1 = dateOfmyFile.getTime(); 
     dateOfmyFile=f2.getTimestamp(); 
     Date dateF2 = dateOfmyFile.getTime(); 
     long difference = dateF1-dateF2; 
     if(difference<0) 
      return dateF2; 
     else 
      return dateF1; 
}