2015-02-24 52 views
3

如果我有一個包含大量文件(大約1000個文件)的目錄。其中一些文件名爲。加工等。如何使用java只列出目錄中的N個文件

如何只列出10個未處理的文件。

我正在使用此代碼來過濾處理的文件。

File[] inputFileList = inputDirectory.listFiles(new FileFilter() { 
       @Override 
       public boolean accept(File pathname) { 
        return !pathname.getName().endsWith(".processed"); 
       } 
      }); 

但是,如果未處理文件的數量很大,則可能導致內存錯誤。所以我需要在每次應用程序運行時讀取有限數量的文件。

回答

11

這就是爲什麼你應該使用java.nio.file。使用Java 8:

final Path baseDir = Paths.get("path/to/dir"); 

final List<Path> tenFirstEntries; 

final BiPredicate<Path, BasicFileAttributes> predicate = (path, attrs) 
    -> attrs.isRegularFile() && path.getFileName().endsWith(".processed"); 

try (
    final Stream<Path> stream = Files.find(baseDir, 1, predicate); 
) { 
    tenFirstEntries = stream.limit(10L).collect(Collectors.toList()); 
} 

使用Java 7:

final Path baseDir = Paths.get("path/to/dir"); 

final List<Path> tenFirstEntries = new ArrayList<>(10); 

final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() 
{ 
    @Override 
    public boolean accept(final Path entry) 
    { 
     return entry.getFileName().endsWith(".processed") 
      && Files.isRegularFile(entry); 
    } 
}; 

try (
    final DirectoryStream<Path> stream 
     = Files.newDirectoryStream(baseDir, filter); 
) { 
    final Iterator<Path> iterator = stream.iterator(); 
    for (int i = 0; iterator.hasNext() && i < 10; i++) 
     tenFirstEntries.add(iterator.next()); 
} 

不像File.listFiles(),java.nio.file使用懶洋洋地填充目錄項的流。

另一個原因溝File。畢竟這是2015年。

+1

注意endsWith()for Path的工作方式與String不同 – 2016-07-25 11:28:25

2

在Java 8中,您可以直接使用Files.walk()創建PathStream

Path folder = Paths.get("..."); 
final int nbFilesToFound = 10; 
List<Path> collect = Files.walk(folder) 
          .filter(p -> Files.isRegularFile(p) && !p.getFileName().toString().endsWith(".processed")) 
          .limit(nbFilesToFound) 
          .collect(Collectors.toList()); 

在Java 7,你不應該,如果你想這些文件迭代就停止作爲的使用數量DirectoryStream.Filter要找到的文件已達到。 您可以創建SimpleFileVisitor實現來實現它。

無論文件數量多少,要達到這樣一個要求:使用SimpleFileVisitor從一個目錄中提取與謂詞相匹配的特定數量的文件,看起來比DirectoryStream.Filter更直和更高效。
所以我認爲它應該受到青睞。
看到我的回答在this duplicate看到如何實現它。

相關問題