2015-02-24 112 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看到如何实现它。

相关问题