java - 如何使用java只列出目录中的N个文件

标签 java java-io

如果我有一个目录包含很多文件(大约 1000 个文件)。其中一些文件名为 .processed 而其他文件则没有。

如何只列出 10 个未处理的文件。

我正在使用这段代码来过滤已处理的文件。

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

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

最佳答案

这就是您应该使用 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 年了。

关于java - 如何使用java只列出目录中的N个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28694900/

相关文章:

java - 如何向 Cucumber Runner 类添加多个功能文件

java - 单击新位置时如何阻止形状消失?

java - 在java中从xml字符串创建org.w3c.dom.Document时出现问题

java - 在 Java 中测试空 InputStream

java - 从文件中读取文本行

java - 测量长时间间隔

java - 如何使用Java中的Comparable接口(interface)按参数对对象数组进行排序?

java - 在Java中修改二进制文件的内容

java - 关于Java I/O类的问题

java - 使用java分割巨大的文本文件来读取它们