我有成千上万个文件要列出。我认为这是一件相当简单的事情,例如,在我的Ubuntu笔记本电脑上立即运行find -iname "*.abc" | wc -l
。不幸的是,基于良好的旧File API的Java中的等效代码相当慢。
原因似乎是每个File
实例都包含很多元数据,而find
命令很聪明,可以忽略其搜索中严格不需要的所有内容。
NIO 2似乎具有一些“新”结构来改善我们的生活:我们有一个新的基于Visitor的API和DirectoryStream API。但是与find
相比,它们似乎仍然滞后。
如果我们只需要在一组文件夹中列出(或说要使其更简单地计算)文件夹中的大量文件,那么Java中最快的方法中最快的是什么?
谢谢
答案 0 :(得分:0)
也许您可以尝试使用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。
如果您需要程序在不同操作系统之间兼容,则可以基于OS创建一个分支,以处理Windows命令,Unix命令,然后使用当前用于File的方法(如果可以) t由于某种原因启动了上述过程。
如果使用此方法,则必须将进程的输出重定向到可以在Java中操作的东西。