2013-08-23 46 views
2

我有一个超过100K文件的目录,我想为每个文件执行一些功能。现在,我使用File.listFiles()要做到这一点,但是这是非常低效的,因为:列出目录中的Java文件

  1. 发生前的任何处理,造成不必要的长挂的所有文件名必须读取。
  2. 所有文件名最终被放入数组中,占用大量内存。在任何时候,我只需要足够的内存来存储一个文件名,但在这里我总是需要足够的内存来存储所有文件名。

我真正想要的东西就像一个UNIX目录句柄,但我找不到像这样的东西。我还查找了OpenJDK中的File.listFiles()究竟如何,但它最终的结果是native function call for UNIX-based systems (line 268)for Windows (line 525)。更糟糕的是,本地调用预计会返回数组。

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

回答

4

如果您使用的是Java 7,NIO2的新路径获得一个目录作为流的文件(如迭代器)

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

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>