是否有任何理智的方法从Java运行忽略STDOUT和STDERR的系统命令?例如,当我尝试以下操作时:
Process p = Runtime.getRuntime().exec("some_executable_path param1 param2 >NUL 2>&1");
Run Code Online (Sandbox Code Playgroud)
Java尝试解析命令,并最终转义参数(例如,阻止输出被重定向).如果我不重定向STDOUT/STDERR,缓冲区将填满并阻止系统调用退出.以下是我想要的,但是非常麻烦并且创建昂贵的资源只是为了抛弃系统调用的输出:
ProcessBuilder pb = new ProcessBuilder("some_executable_path", "param1", "param2");
pb.redirectErrorStream(true);
final Process p = pb.start();
final Thread redirectToNull = new Thread(() -> {
final InputStream stdout = process.getInputStream();
try {
while (stdout.read() != -1);
} catch (final Exception e) {
// Don't care
}
}, "Output Consumer Thread");
redirectToNull.setDaemon(true);
redirectToNull.start();
Run Code Online (Sandbox Code Playgroud)
我知道Java设计团队被称为自虐,但这很荒谬.我更愿意提供一个批处理或Perl脚本,用我的应用程序包装系统调用,而不是使用上面的代码.必须有一种更简单的方法来实现这一目标.
所以问题是,是否有任何理智的方法从Java中运行系统命令并忽略打印到STDOUT/STDERR的输出?
这不是Java'阻止'重定向,它不是肯定地做,并且你的程序也没有.当你给CMD命令一样program arg1 arg2 >out 2>err <in,它是CMD,设置了这些重定向,然后调用program与arg1 arg2 唯一,不是>out等在Unix炮弹做同样的-有几个炮弹的选择,但他们都处理重定向像这样.类似地,管道由CMD或shell设置,而不是由在这些管道中运行的任何或所有程序设置.
因此在Windows上,执行此操作的方法是运行CMD并让它执行重定向:
Process p = new ProcessBuilder ("cmd", "/c", "program arg1 arg2 >NUL 2>&1").start();
// this uses CMD's default parsing for args, so they must not contain space
// unless you insert 'data' quotes, or things that look like a substitutable %var%
Run Code Online (Sandbox Code Playgroud)
或者(假设Java7 +)告诉ProcessBuilder做重定向:
pb.redirectOutput (new File("NUL")).redirectErrorStream(true)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1129 次 |
| 最近记录: |