0

これは、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を送信することがこのメッセージの原因であることを確認しました。

誰もがこれを引き起こしている可能性があることを知っていますか?

重要な場合は、cmd / c test.exeではなく「test.exe」としてプロセスを直接実行しようとしましたが、実行すると、inputStreamを介して出力を確認できません。また、/cを指定せずにcmdtest.exeを実行しても、違いはありません。

4

2 に答える 2

1

コードは機能するように見えます(注意点が1つあります。以下を参照してください)。

私はあなたのコードを逐語的に取り、パイプされたstdinから読み取ることができるに 置き換えましtest.extた。sort

コードをそのまま実行すると、sortコマンドが開始され、入力を待機します。child.waitFor()EOFを示すために出力ストリームを閉じないため、ハングします。呼び出しを追加するclose()と、すべてが正しく機能します。

test.exeパイプされたstdinから読み取ることができるかどうか、またはコンソール入力を期待しているかどうかを確認して判断することをお勧めします。

于 2012-04-04T03:48:26.747 に答える
0

「cmd」と「/c」を削除します。現在、test.exeではなくcmd.exeに出力を供給しています。

于 2012-04-04T02:50:57.013 に答える