与平台无关的使用ProcessBuilder丢弃/错误的方法

2019年12月1日 7点热度 0条评论

在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-非Windows的情况(但是我不确定这种情况是否存在)。

我知道
platform-independent /dev/null output sink for Java和类似的问题,但是使用no-op
OutputStream仍然需要旋转线程以主动丢弃输出-我宁愿让OS替我做。

解决方案如下:

从Python的subprocess模块的行为来看,问题中的代码片段可能就足够了。 subprocess.DEVNULL uses os.devnull,依次为comes from os.path(在ntpath(作为nul)或posixpath(作为/dev/null)中定义)。

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