使用 ProcessBuilder 丢弃 out/err 的平台无关方式

Platform-independent way to discard out/err with ProcessBuilder

在 Unix 上,您可以使用以下方法丢弃进程的输出:

pb.redirectOutput(new File("/dev/null"));

在 Windows 上,您需要使用 NUL。是否有比以下代码片段更好的选项来支持任意平台?

File devNull = new File("/dev/null");
if (devNull.exists()) {
  pb.redirectOutput(devNull);
} else {
  pb.redirectOutput(new File("NUL"));
}

这看起来很笨拙,但在 API.

中没有 ProcessBuilder.Redirect.NULL 字段可供使用或似乎没有任何其他方法可以做到这一点

我也有点担心这不能处理非 Unix-non-Windows 的情况(但我不确定这种情况是否存在)。

我知道 platform-independent /dev/null output sink for Java 和类似的问题,但是使用空操作 OutputStream 仍然需要启动一个线程以主动丢弃输出 - 我更愿意让 OS 帮我做。

从 Python 的 subprocess module the code snippet in the question is likely sufficient. subprocess.DEVNULL uses os.devnull, which in turn comes from os.path which is defined in either ntpath (as nul) or posixpath(与 /dev/null 一样)的行为来看。

这些似乎是 Python 支持的唯一路径,因此类似地,在 Java 中适当使用 nul/dev/null 应该就足够了。 Java 可能有一个更优雅、平台独立的选项,但如果是的话我还没有找到它。