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

时间:2012-04-04 01:45:34

标签: java command-line process exec

这是我通过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时,没有任何区别。

2 个答案:

答案 0 :(得分:1)

您的代码看起来应该有效(有一点需要注意,见下文)。

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

如果我按原样运行代码,它会启动sort命令,等待输入。它挂起在child.waitFor(),因为您没有关闭输出流以指示EOF。当我添加close()电话时,一切正常。

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

答案 1 :(得分:0)

摆脱“cmd”和“/ c”。目前您将输出输出到cmd.exe,而不是test.exe。