2

我有一个包含超过 100K 文件的目录,我想为每个文件执行一些功能。现在我正在File.listFiles()这样做,但这非常低效,因为:

  1. 在进行任何处理之前,必须读入所有文件名,从而导致不必要的长时间挂起。
  2. 所有文件名最终都被放入一个数组中,占用大量内存。在任何给定时间,我只需要足够的内存来存储一个文件名,但在这里我总是需要足够的内存来存储所有文件名。

我真正想要的是行为类似于 UNIX 目录句柄的东西,但我找不到这样的东西。我还查看了File.listFiles()OpenJDK 中的确切方式,但最终结果是基于 UNIX 的系统(第 268 行)Windows(第 525 行)的本机函数调用。更糟糕的是,本机调用预计会返回数组。

如果可能的话,我想避免插入 JNI 或调用外部程序。

4

2 回答 2

4

如果您使用的是 Java 7,Nio2 的新 Path 以 Stream 的形式获取目录的文件(如迭代器)

try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        System.out.println(file.getFileName());
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}

查看教程:http ://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir

于 2013-08-23T02:01:37.467 回答
0

您可以将 Java 7FileVisitorFiles.walkFileTree()

Files.walkFileTree(Paths.get("/your/path"), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        // do what you want with the file
        return FileVisitResult.CONTINUE;
    }
    // more methods to override going through directories
});

一次遍历每个文件、目录或符号链接(如果需要)。它在内部使用DirectoryStream<Path>.

于 2013-08-23T02:12:16.847 回答