我有一个包含超过100K文件的目录,我想为每个文件执行一些功能。现在我正在使用File.listFiles()
来执行此操作,但这非常低效,因为:
我真正想要的是一个像UNIX目录句柄一样的东西,但我找不到这样的东西。我还在OpenJDK中查找了File.listFiles()
的确切内容,但它最终以native function call for UNIX-based systems (line 268)和for Windows (line 525)结束。更糟糕的是,原生调用有望返回数组。
如果可能的话,我想避免插入JNI或调用外部程序。
答案 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 FileVisitor
与Files.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>
。