28

Java のProcessBuilderクラスを介してプロセスを開始すると、そのプロセスの標準入力、標準出力、および標準エラー ストリームに JavaInputStreamsおよびOutputStreams. System.inただし、これらのストリームを、System.out、およびにシームレスに接続する方法が見つかりませんSystem.err

redirectErrorStream()サブプロセスの標準出力と標準エラーを含む単一のデータを取得し、InputStreamそれをループして標準出力を介して送信することは可能ですが、それを行う方法が見つからず、ユーザーがプロセスに入力できるようにする方法が見つかりません。、私が Csystem()コールを使用した場合と同様に、彼または彼女は可能でした。

これは、Java SE 7 がリリースされた時点で可能のようです。現在、回避策があるかどうか疑問に思っています。isatty()子プロセスの結果がリダイレクトを通過する場合のボーナス ポイント。

4

3 に答える 3

16

プロセスの出力、エラー、および入力ストリームをシステム バージョンにコピーする必要があります。これを行う最も簡単な方法は、Commons IO パッケージのIOUtilsクラスを使用することです。copy メソッドは必要なもののようです。コピー メソッドの呼び出しは、別のスレッドで行う必要があります。

基本的なコードは次のとおりです。

// Assume you already have a processBuilder all configured and ready to go
final Process process = processBuilder.start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getOutputStream(), System.out);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getErrorStream(), System.err);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(System.in, process.getInputStream());
} } ).start();
于 2008-09-13T14:51:41.387 に答える
12

コンパイルされ、Commons IO を使用する必要がないジョンの回答のバリエーション:

private static void pipeOutput(Process process) {
    pipe(process.getErrorStream(), System.err);
    pipe(process.getInputStream(), System.out);
}

private static void pipe(final InputStream src, final PrintStream dest) {
    new Thread(new Runnable() {
        public void run() {
            try {
                byte[] buffer = new byte[1024];
                for (int n = 0; n != -1; n = src.read(buffer)) {
                    dest.write(buffer, 0, n);
                }
            } catch (IOException e) { // just exit
            }
        }
    }).start();
}
于 2009-10-15T04:25:18.363 に答える
2

の代わりに以下をSystem.in使用するにはpipein()pipe()

pipein(System.in, p.getOutputStream());

実装:

private static void pipein(final InputStream src, final OutputStream dest) {

    new Thread(new Runnable() {
        public void run() {
            try {
               int ret = -1;
               while ((ret = System.in.read()) != -1) {
                  dest.write(ret);
                  dest.flush();
               }
            } catch (IOException e) { // just exit
            }
        }
    }).start();

}
于 2011-06-10T08:19:32.010 に答える