11

他の言語(bashPythonなど)では、子プロセスを生成すると、この新しいプロセスは親からstdoutとstderrを継承します。これは、子プロセスからの出力が親からの出力と同様に端末に出力されることを意味します。

Javaで同じ動作を実現するにはどうすればよいですか?

私の最初の試みは:

proc = Runtime.getRuntime().exec(cmd);

しかし、それは機能しません。この回答この回答に基づいて、コードを次のように置き換えました。

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(System.out);
pb.redirectError(System.err);

しかし、引数は期待されるメソッドパラメータと互換性がないため、これはコンパイルすらしません。

4

3 に答える 3

18

作成したプロセスの出力ストリームとエラーストリームを読み取り、出力を目的の場所(この場合はSystem.outとSystem.err)に書き込む必要があります。

編集。上記の答えは、java <7の場合は正しいです。javadocの7の時点で、代わりに呼び出すことができるようです。

processBuilder.redirectOutput(Redirect.INHERIT)
于 2012-05-10T19:18:04.750 に答える
3

これはそれほど悪くはありません。最初は「簡単」と言った後、InputStreamConsumerをコーディングする必要があることに気付きました。

public static class InputStreamConsumer extends Thread {

    private InputStream is;

    public InputStreamConsumer(InputStream is) {
        this.is = is;
    }

    @Override
    public void run() {

        try {
            int value = -1;
            while ((value = is.read()) != -1) {
                System.out.print((char)value);
            }
        } catch (IOException exp) {
            exp.printStackTrace();
        }
    }
}

private void captureOutput(Process p) {

    InputStreamConsumer stdout;
    InputStreamConsumer errout;

    errout = new InputStreamConsumer(p.getErrorStream());
    stdout = new InputStreamConsumer(p.getInputStream());
    errout.start();
    stdout.start();
}

....のようなものの中で走っている...

    ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/D", "/C", myCommand, parm, parm...);
    try {
        System.out.println("Start "+myCommand);
        Process myProcess = pb.start();
        captureOutput(myProcess);

        int returnCode = myProcess.waitFor();
        System.out.println("myProcess: return code : "+returnCode);
    }
    catch (IOException e) {
        e.printStackTrace();
    }
于 2014-03-28T17:15:46.353 に答える
1

それは確かに可能です。Ant Javaタスクは、forkがtrueに設定されている場合にこれを実行します。すべての詳細を覚えているわけではありませんが、簡単に見ると、ほとんどの魔法はPumpStreamHandlerにあるようです。そこからインスピレーションを得てみてください。

于 2012-05-10T19:19:53.543 に答える