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

时间:2018-04-14 12:48:52

标签: java processbuilder

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

可以使用以下命令将输出重定向到一个文件:

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

我试着这样做:

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

但它只会写入第二个文件。

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

1 个答案:

答案 0 :(得分:2)

redirectOutput(ProcessBuilder.Redirect) ProcessBuilder方法设置构建器的属性。如果再次调用它,则会使用您指定的新值再次设置该属性。你不能以这种方式复制输出,部分原因是因为ProcessBuilder不能以这种方式工作,而且因为它构建的Process只有一个输出流可以重定向到开头。

您有几种选择,其中包括:

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

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

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