繁体   English   中英

用Java列出文件的最快方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM