Java 进程生成器 : How to suppress output instead of redirecting it

标签 java java-8

我正在使用 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();

最佳答案

DISCARD 重定向选项已添加到 Java 9 中。如果升级 Java,则可以使用它。否则,您可以简单地复制该行为,因为 DISCARD 重定向枚举使用重定向到空设备的文件实例,如下所示。

   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 的行为相同。

关于Java 进程生成器 : How to suppress output instead of redirecting it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628999/

相关文章:

java - 从现有外部 .dll 调用方法。例如,来自 kernel32.dll 的 CopyFileA

java - java中spark cassandra连接器出现问题

java - LocalDate:缺少方法 isEqualOrBefore 和 isEqualOrAfter

java - 认可的 dir 机制不起作用?

Eclipse 开普勒 Java 8

java - 转换可选或流的内容

java - 在 Java 中使用 kerberos 票证获取 AD 组

java - 如何从音频文件中提取MDCT系数?

java - Android 无法设置 TextView 的颜色

java - 如何从 lambda 表达式返回值?