如何使用Java列出目录中仅有N个文件

4
如果我有一个包含大量文件(约1000个文件)的目录。其中一些文件名为.processed,而其他文件则不是。
如何列出仅有的10个未处理文件。
我正在使用以下代码来过滤已处理的文件。
File[] inputFileList = inputDirectory.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return !pathname.getName().endsWith(".processed");
                }
            });

但是如果未处理文件的数量很大,这可能会导致内存错误。因此,每次运行应用程序时,我需要读取有限数量的文件。

2个回答

13

这就是为什么你应该使用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
请注意,Path 的 endsWith() 方法的工作方式与 String 的不同。 - Andrei_N

4
在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更直观和高效。因此,我认为应该优先使用SimpleFileVisitor
请参见此重复问题中的我的答案,以了解如何实现它。

这会限制将所有文件加载到内存中,然后进行过滤吗? - KARTHICK JOTHIMANI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接