2

外部スクリプトを実行しているときに、このスクリプトのErrorStreamとOutputStreamを同時に別々に読み取り、さらに処理したいと思います。したがって、Threadストリームの1つに対してを開始します。残念ながら、は終了ProcessしていないようですがwaitForThreadスレッド化されていないストリームにそれ以上の入力がなくなった後に戻ります。

一言で言えば、これが私がしていることです:

ProcessBuilder pb = new ProcessBuilder(script);  
final Process p = pb.start();  

new Thread(new Runnable() {  
  public void run() {
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    ...read lines and process them...
  }
}).start();

BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
...read lines and process them...

int exitValue = p.waitFor();
p.getOutputStream().close();
return exitValue;

waitFor終了する可能性はありThreadますか?

4

2 に答える 2

1

これがあなたがやりたいことをするための一般的なコードです。この場合、入力と出力の両方があります。私はsomeFileプロセスに配管し、出力をに配管していますSystem.outFiles.copy()とをに接続するためByteStreams.copy()のGuavaの便利なメソッドです。次に、コマンドが終了するのを待ちます。InputStreamOutputStream

final Process pr = Runtime.getRuntime().exec(cmd);

new Thread() {
    public void run() {
        try (OutputStream stdin = pr.getOutputStream()) {
            Files.copy(someFile, stdin);
        } 
        catch (IOException e) { e.printStackTrace(); }
    }
}.start();

new Thread() {
    public void run() {
        try (InputStream stdout = pr.getInputStream()) {
            ByteStreams.copy(stdout, System.out);
        } 
        catch (IOException e) { e.printStackTrace(); }  
    }
}.start();              

int exitVal = pr.waitFor();
if( exitVal == 0 )
    System.out.println("Command succeeded!");
else    
    System.out.println("Exited with error code " + exitVal);

try-with-resourcesブロックを使用してJava7より前で実行している場合は、より詳細なバージョンを使用します。

final Process pr = Runtime.getRuntime().exec(cmd);

new Thread() {
    public void run() {
        OutputStream stdin = null;
        try {
            Files.copy(someFile, stdin = pr.getOutputStream());
        } 
        catch (IOException e) { e.printStackTrace(); }
        finally {
            if( stdin != null ) {
                try { stdin.close(); } 
                catch (IOException e) { e.printStackTrace(); }
            }
        }               
    }
}.start();

new Thread() {
    public void run() {
        InputStream stdout = null;
        try {
            ByteStreams.copy(stdout = pr.getInputStream(), System.out);
        } 
        catch (IOException e) { e.printStackTrace(); }
        finally {
            if( stdout != null ) {
                try { stdout.close(); } 
                catch (IOException e) { e.printStackTrace(); }
            }
        }               
    }
}.start();              

int exitVal = pr.waitFor();
if( exitVal == 0 )
    System.out.println("Command succeeded!");
else    
    System.out.println("Exited with error code " + exitVal);
于 2013-03-18T17:17:45.843 に答える
1

Thread.join(...)が終了するのを待つために使用できますThreadInterruptedException待機しているスレッドが終了する前に現在のスレッドが割り込みを受け取った場合、呼び出しがスローされることに注意してください。

于 2013-03-18T17:29:30.057 に答える