[英]Fastest way to list files in Java
我有成千上万的文件要列出。 我认为这是一件相当简单的事情,例如,运行find -iname "*.abc" | wc -l
find -iname "*.abc" | wc -l
立即在我的Ubuntu笔记本电脑上运行。 不幸的是,基于良好的旧File API的Java中的等效代码非常慢。
原因似乎是每个File
实例都包含许多元数据,而find
命令很聪明,可以忽略搜索中严格不需要的所有内容。
NIO 2似乎具有一些“新”结构来改善我们的生活:我们有一个新的基于Visitor的API和DirectoryStream API。 但是与find
相比,它们似乎仍然滞后。
当我们所需要做的就是在一组文件夹中列出(或者说,使其现在更简单一些)计数时,Java中最快的方法中最快的是什么?
谢谢
也许您可以尝试使用ProcessBuilder调用Shell命令。 下面的代码显示了如何从Java执行find命令。
public static void main(final String[] args) throws IOException {
// if running linux:
runFind();
}
private static void runFind() throws IOException {
String[] commandList = {"/bin/sh", "-c", "find -iname \"*.txt\" | wc -l"};
ProcessBuilder processBuilder = new ProcessBuilder(commandList);
processBuilder.redirectOutput(Redirect.INHERIT); // Redirect output of process
Process process = processBuilder.start();
}
上面的代码仅适用于Unix设备。 Windows的唯一区别是您的命令列表:
String[] commandList = { "cmd.exe", "/C", "dir" };
将“ dir”替换为与您要进行的find调用等效的Windows。
如果您需要程序在不同操作系统之间兼容,则可以基于操作系统创建一个分支,以处理Windows命令,Unix命令,然后在无法使用某些文件的情况下使用当前用于File的方法。原因按上述步骤启动。
如果使用此方法,则必须将流程的输出重定向到可以在Java中操作的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.