2015-04-01 46 views
-1

我以這種方式實現java.io.FileFilter如何將一些值傳遞給我的java.io.FileFilter實現?

//get a list of files that: 
    // aren't directories 
    // have lastmodified times over X seconds in the past. 
//And only get first Y files, even if there are more present. 
private File[] getInputFiles(String inputDirectory) { 
    return new File(inputDirectory).listFiles(new FileFilter() { 
     int counter = 2; //TODO parameterize as Y 

     @Override 
     public boolean accept(File pathname) { 
      counter--; 
      return !pathname.isDirectory() 
       && pathname.lastModified() < 
        System.currentTimeMillis() - 30 * 1000 //TODO parameterize as X 
       && counter >= -1; 

     } 
    }); 
} 

正如你所看到的,有魔力的數字在我的代碼。我想用參數替換它們。

我試過new FileFilter(int X, int Y) {...},但這是一個編譯時錯誤。

注:Java 7中(我認爲一些Java 8層的功能可以幫助在這裏,就不幸的是,這應該是Java 7中?)

+1

簡單地聲明一些本地或類常量變量和匿名類體中使用它們。 – 2015-04-01 19:56:53

+0

...或將匿名課程改爲正常課程以將計數器作爲ctor參數傳遞。 – tomse 2015-04-01 19:59:31

+0

我可以問一下'counter'是什麼用途?起初我以爲你想限制發現文件的數量爲2 - 但這不是這種情況,例如如果前2個條目是目錄 - 則數組將爲空。 – tomse 2015-04-01 20:59:16

回答

2

由於您使用的是Java 7+,不打擾File。使用java.nio.file。

而你想要的是一個DirectoryStream.Filter<Path>。它與FileFilter具有幾乎相同的簽名,其優點是您將用於從目錄中獲取條目的方法(Files.newDirectoryStream())實際上將返回目錄條目的延遲加載迭代器,其中File將加載所有條目。

public final class MyFilter 
    implements DirectoryStream.Filter<Path> 
{ 
    // Now minus 30 seconds 
    private final FileTime timestamp 
     = FileTime.fromMillis(System.currentTimeMillis() - 30_000); 
    private int counter; 

    public MyFilter(final int initialCounter) 
    { 
     counter = initialCounter; 
    } 

    @Override 
    public boolean accept(final Path entry) 
    { 
     counter--; 

     if (!Files.isRegularFile(entry)) 
      return false; 
     if (Files.getLastModifiedTime(entry).compareTo(timestamp) >= 0) 
      return false; 

     return counter > 0; 
    } 
} 

然後:

private List<Path> getInputFiles(final String baseDir, final int counter) 
{ 
    final Path path = Paths.get(baseDir); 
    final List<Path> result = new ArrayList<>(); 
    final DirectoryStream.Filter<Path> filter 
     = new MyFilter(counter); 

    try (
     final DirectoryStream<Path> stream = Files.newDirectoryStream(path, filter); 
    ) { 
     for (final Path entry: stream) 
      result.add(entry); 
    } 

    return result; 
} 
+1

是的,使用java.nio.file是非常可取的。順便說一下,DirectoryStream應該(自動)關閉,IOException應該在方法簽名(或捕獲)中聲明。我猜你知道這一切,但逐字複製答案的人可能不會。 – VGR 2015-04-01 20:26:33

+0

@VGR優點;修復了 – fge 2015-04-01 20:37:40

+0

fge和@VGR,這個答案就是我要用的。我最初問的問題是上面標記的重複。這個答案回答了我*應該*問的問題! – daveloyall 2015-04-02 16:31:48