我正在使用 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/