是否可以将 ProcessBuilder 的输出重定向到多个文件?

Is it possible to redirectOutput of ProcessBuilder to more than one file?

我想将 ProcessBuilder 的输出重定向到多个文件。

可以将输出重定向到只有一个文件:

new ProcessBuilder().redirectOutput(Redirect.appendTo(outputFile));

我试过:

new ProcessBuilder().redirectOutput(Redirect.appendTo(outputFile))
                    .redirectOutput(Redirect.appendTo(outputFile2));

但它只写入第二个文件。

如何将相同的输出写入多个文件?

ProcessBuilderredirectOutput(ProcessBuilder.Redirect)方法设置了一个属性的构建器。如果您再次调用它,它会再次设置 属性,并使用您指定的新值。您不能以这种方式复制输出,部分原因是 ProcessBuilder 不能那样工作,还因为它正在构建的 Process 只有一个输出流可以重定向到开始。

您有多种选择,其中:

  • 重定向到单个文件,然后复制文件。
  • 将输出重定向回您的 Java 程序(Redirect.PIPE,这是默认设置)。然后让您的程序读取进程的输出并将其写入两个目标文件。如果进程相对于 Java 是异步的,那么您需要设置 Java 侧流拆分到 运行 它自己的线程。
  • 如果您的操作环境有可以帮助您的命令,例如 UNIX tee,那么您可以调整进程 运行s 中的命令,以便它创建了输出本身的一个副本。例如,

    new ProcessBuilder().command("bash", "-c", "mycommand --option | tee output1")
            .redirectOutput(Redirect.appendTo(outputFile2));
    

其中,第二个是唯一一个完全由 Java 处理并且独立于操作环境的。但是,如果它适合您的情况,第三种可能是最容易获得的 运行ning。