用Java列出文件的最快方法

时间:2018-09-05 18:21:53

标签: java file nio nio2

我有成千上万个文件要列出。我认为这是一件相当简单的事情,例如,在我的Ubuntu笔记本电脑上立即运行find -iname "*.abc" | wc -l。不幸的是,基于良好的旧File API的Java中的等效代码相当慢。

原因似乎是每个File实例都包含很多元数据,而find命令很聪明,可以忽略其搜索中严格不需要的所有内容。

NIO 2似乎具有一些“新”结构来改善我们的生活:我们有一个新的基于Visitor的API和DirectoryStream API。但是与find相比,它们似乎仍然滞后。

如果我们只需要在一组文件夹中列出(或说要使其更简单地计算)文件夹中的大量文件,那么Java中最快的方法中最快的是什么?

谢谢

1 个答案:

答案 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中操作的东西。