这是我通过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时,没有任何区别。
答案 0 :(得分:1)
您的代码看起来应该有效(有一点需要注意,见下文)。
我逐字地接受了您的代码并将test.ext
替换为sort
,这可以从管道标准输入读取。
如果我按原样运行代码,它会启动sort命令,等待输入。它挂起在child.waitFor()
,因为您没有关闭输出流以指示EOF。当我添加close()
电话时,一切正常。
我建议您查看test.exe
并确定它是否能够从管道标准输入读取,或者是否期望控制台输入。
答案 1 :(得分:0)
摆脱“cmd”和“/ c”。目前您将输出输出到cmd.exe,而不是test.exe。