gpt4 book ai didi

java - runtime.exec 立即发送 EOF 到输入?

转载 作者:行者123 更新时间:2023-12-01 15:27:17 25 4
gpt4 key购买 nike

这是我通过 java 在 Windows 中启动进程(并吞噬输出)的代码。

    public static void main(String[] args) throws Exception {
String[] command = new String[3];
command[0] = "cmd";
command[1] = "/C";
command[2] = "test.exe";
final Process child = Runtime.getRuntime().exec(command);
new StreamGobbler(child.getInputStream(), "out").start();
new StreamGobbler(child.getErrorStream(), "err").start();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
child.getOutputStream()));
out.write("exit\r\n");
out.flush();
child.waitFor();
}

private static class StreamGobbler extends Thread {
private final InputStream inputStream;
private final String name;

public StreamGobbler(InputStream inputStream, String name) {
this.inputStream = inputStream;
this.name = name;
}

public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
inputStream));
for (String s = in.readLine(); s != null; s = in.readLine()) {
System.out.println(name + ": " + s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

不知何故,有问题的程序(进程)立即收到一个 EOF(就像我跨过“exec”行之后),因此在调用 runtime.exec 后立即抛出错误(检测到,无效)消息。我可以通过命令提示符手动运行此程序,而不会出现此问题,但已确认在 Windows 上发送 ctrl-z 是导致此消息的原因。

谁知道这可能是什么原因造成的?

如果重要的话,我尝试直接以“test.exe”而不是 cmd/c test.exe 的形式运行该进程,但是当我这样做时,我无法通过 inputStream 查看输出。当我执行不带/c 的 cmd test.exe 时,没有区别。

最佳答案

您的代码看起来应该可以工作(有一个警告,请参见下文)。

我逐字记录了您的代码,并将 test.ext 替换为 sort,它可以从管道标准输入读取。

如果我按原样运行代码,它将启动排序命令,该命令等待输入。它卡在 child.waitFor() 处,因为您没有关闭输出流来指示 EOF。当我添加 close() 调用时,一切正常。

我建议您查看 test.exe 并确定它是否能够从管道标准输入读取,或者是否需要控制台输入。

关于java - runtime.exec 立即发送 EOF 到输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003942/

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