2008-09-13 92 views
28

/標準錯誤的過程。如果我開始通過Java的ProcessBuilder類的過程,我有充分的機會來在這一過程中的標準,標準出來,如Java InputStreamsOutputStreams標準錯誤流。但是,我找不到將這些流無縫連接到System.in,System.outSystem.err的方法。開始與繼承標準輸入/輸出Java 6中

它可以使用redirectErrorStream()獲取包含子進程的標準出單InputStream和標準錯誤,並通過剛剛循環,並通過我的標準把它發送出去,但我不能找到一個方法來做到這一點,讓用戶鍵入流程,如果我使用C system()呼叫,他/她可以。

在Java SE 7出現時,這似乎是可行的 - 我只是想知道現在是否有解決方法。如果子進程中的isatty()的結果進行重定向,則爲積分。

+0

對不起,我忍不住。 – jjnguy 2008-09-13 04:33:04

+0

沒問題。 (順便說一句,我不是那個低頭讚揚你的人。) – 2008-09-13 04:35:08

+0

恩,好吧,謝謝那個不贊成我的人。謝謝你,約翰不要低估我。 – jjnguy 2008-09-13 04:37:54

回答

15

您需要將Process out,err和輸入流複製到系統版本。最簡單的方法是使用Commons IO軟件包中的IOUtils類。 copy method看起來是你所需要的。複製方法調用將需要位於不同的線程中。

這是基本的代碼:

// 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(); 
13

,編譯,並且不要求您使用共享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(); 
} 
3

對於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(); 

} 
相關問題