Java ProcessBuilder:如何抑制输出而不是重定向它

10

我正在使用ProcessBuilder来执行命令并重定向输出。现在我想增加完全没有输出的可能性。

当然,我可以将输出重定向到文件,但这会在用户系统上留下不必要的文件。

我正在寻找的解决方案是:

  • 适用于所有平台,包括Windows(例如,不要重定向到/dev/null)
  • 不要滥用try-catch(例如,重定向到null并忽略异常)

我能找到的唯一方法是:

ProcessBuilder processBuilder = new ProcessBuilder(command);
if (suppressOutput) {
        processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);
}

但是这会输出到底层的shell,与字面意义上的“没有输出”不符。

这是我使用ProcessBuilder而未禁止输出的示例:

ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.directory(new File(workingdir));
processBuilder.redirectErrorStream(true);
Process process = processBuilder.start();

while (process.isAlive()) {
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) { }
    // check for termination request
    if (terminationRequest()) {
        process.destroy();
        return -1;
    }
}
return process.exitValue();
2个回答

21

在Java 9中新增了DISCARD重定向选项。如果您升级到Java,则可以使用它。否则,您可以简单地复制该行为,因为DISCARD重定向枚举使用一个文件实例,该实例重定向到null设备,如下所示。

   private static File NULL_FILE = new File(
          (System.getProperty("os.name")
                     .startsWith("Windows") ? "NUL" : "/dev/null")
   );

然后您可以使用重载的redirectOutput方法;

if (suppressOutput) {
   processBuilder.redirectOutput(NULL_FILE);
}

这与Java 9的行为相同。


你是否在重复使用 ProcessBuilder 实例? - Laksitha Ranasingha
你尝试在终端上运行代码了吗(而不是在Eclipse上)?同时请发布完整的工作示例,这样我就可以尝试一下。 - Laksitha Ranasingha
1
它正在工作。对于混淆我感到抱歉。我有一些来自其他代码的副作用影响了我的日志记录服务。 - Sadık

1
Java 9+的解决方案,用于丢弃进程输出:
ProcessBuilder processBuilder = new ProcessBuilder(command);
processBuilder.redirectOutput(Redirect.DISCARD);
processBuilder.redirectError(Redirect.DISCARD);
Process process = processBuilder.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接