gpt4 book ai didi

Java 运行系统命令并忽略输出

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:01 24 4
gpt4 key购买 nike

有什么明智的方法可以从忽略 STDOUT 和 STDERR 的 Java 运行系统命令?例如,当我尝试以下操作时:

Process p = Runtime.getRuntime().exec("some_executable_path param1 param2 >NUL 2>&1");

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();

我知道 Java 设计团队是出了名的受虐狂,但这太荒谬了。我宁愿提供一个批处理或 Perl 脚本来包装我的应用程序的系统调用,而不是使用上面的代码。必须有一种更简单的方法来实现这一点。

所以问题是,是否有任何明智的方法可以从 Java 中运行系统命令并忽略打印到 STDOUT/STDERR 的输出?

最佳答案

并不是 Java“阻止”重定向,它只是没有肯定地这样做,您的程序也没有。当你给 CMD 一个像 program arg1 arg2 >out 2>err <in 这样的命令时, 是 CMD 设置这些重定向然后调用 programarg1 arg2 只有,不是>out等。在 Unix 上,shell 做同样的事情——有几个 shell 可供选择,但它们都像这样处理重定向。类似地,管道是由 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%

或者(假设 Java7+)告诉 ProcessBuilder做重定向:

pb.redirectOutput (new File("NUL")).redirectErrorStream(true)

关于Java 运行系统命令并忽略输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com