使用 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 可能有一个更优雅、平台独立的选项,但如果是的话我还没有找到它。
在 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 可能有一个更优雅、平台独立的选项,但如果是的话我还没有找到它。