在Java中列出按需目录中的文件

时间:2013-08-23 01:58:30

标签: java io file-listing

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

  1. 在进行任何处理之前,必须读入所有文件名,从而导致不必要的长时间挂起。
  2. 所有文件名最终都被放入一个数组中,占用了大量内存。在任何给定的时间我只需要足够的内存来存储一个文件名,但在这里我总是需要足够的内存来存储所有文件名。
  3. 我真正想要的是一个像UNIX目录句柄一样的东西,但我找不到这样的东西。我还在OpenJDK中查找了File.listFiles()的确切内容,但它最终以native function call for UNIX-based systems (line 268)for Windows (line 525)结束。更糟糕的是,原生调用有望返回数组。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将Java 7 FileVisitorFiles.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>