我有数万甚至数十万个文件要列出。我认为这将是一件相当简单的事情,例如运行 find -iname "*.abc"| wc -l
在我的 Ubuntu 笔记本电脑上立即运行。不幸的是,基于旧的 File API 的 Java 中的等效代码相当慢。
原因似乎是每个 File
实例都包含大量元数据,而 find
命令足够智能,可以忽略搜索中并非严格需要的所有内容。
NIO 2 似乎有一些"new"结构来让我们的生活变得更好:我们有一个新的基于 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 中操作的内容。
关于java - 在 Java 中列出文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52191303/