代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

在爪哇列出文件的最快方法

  •  1
  • devoured elysium  · 技术社区  · 6 年前

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

    原因似乎是 File 实例包含大量元数据,而 find 命令足够聪明,可以忽略搜索中不严格需要的所有内容。

    NIO2似乎有一些“新”的构造来改善我们的生活:我们有一个新的基于访问者的API和一个DirectoryStream API。但他们似乎仍然落后于 找到 .

    什么是最快的Java中最快的方法,当我们所需要的是列出(或者,让我们现在更简单,计数)一组文件夹中的大量文件?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   Josh Desmond    6 年前

    也许您可以尝试使用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命令,然后使用当前用于文件的方法(如果由于某种原因无法启动上述过程)。

    如果使用此方法,则必须将进程的输出重定向到可以在Java中操作的内容。