java - 在 Java 中列出文件的最快方法

标签 java file nio nio2

我有数万甚至数十万个文件要列出。我认为这将是一件相当简单的事情,例如运行 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/

相关文章:

c - 为什么“while(!feof(file))”总是错误的?

java - Windows 上的 NIO Files.createTempDirectory 导致异常

java - 我可以再举一个 FileAttribute 的例子吗?

java - FileChannel 零拷贝 transferTo 拷贝字节到 SocketChannel 失败

java - 合并具有重复键的 map 列表

java - 如何发送带有空 header 的纯文本 JmsMessage

java - 用Java读取文件

java - Android 中的重叠按钮

java - 简单计数器中的 android 清除按钮

c++ - 从文件中读取行并将它们放入变量中时遇到问题 (C++)