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

Fan*_*oos 4 java java-io

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

如何仅列出10个未处理的文件.

我正在使用此代码来过滤处理过的文件.

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

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

fge*_*fge 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());
}
Run Code Online (Sandbox Code Playgroud)

使用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());
}
Run Code Online (Sandbox Code Playgroud)

File.listFiles()java.nio.file 不同,使用延迟填充的目录条目流.

放弃的另一个原因File.毕竟这是2015年.