1

サブプロセスから標準出力とログ/エラー/例外出力を取得する必要があるプロセスがあります。標準出力は問題ありませんが、ErrorStream を取得できないため、プログラムがスタックしています。これが私の簡単なコードです。魔法は何もありませんが、ここでエラー ストリームを取得できないのはなぜですか? ご覧いただきありがとうございます。

    BufferedReader standard =
         new BufferedReader(new InputStreamReader(process.getInputStream()));

   BufferedReader error = 
   new BufferedReader(new InputStreamReader(process.getErrorStream()));

    String line = null;
    while ((line = standard.readLine()) != null) {            
        System.out.println(line);
    }
    while ((line = error.readLine()) != null) {           
        System.out.println(line);
    }

さて、示唆されているように、2 つのスレッドを使用して出力ストリームとエラー ストリームを処理しましたが、次のように同じ問題が発生しました。誰かが私にいくつかの洞察を与えることができますか? ありがとう。

    ProcessBuilder pb = new ProcessBuilder(listArgs);
    pb.redirectErrorStream();
    Process process = pb.start();

    StreamThread output = new StreamThread(process.getInputStream());
    StreamThread error = new StreamThread(process.getErrorStream());

    output.start();
    error.start();
    while (true) {
        try {
            output.join();
            break;
        }
        catch (InterruptedException ie) {
            ie.printStackTrace();
        }
    }

StreamThread の定義:

    public static class StreamThread extends Thread{
    private InputStream input = null;   
    public StreamThread(InputStream in){
        input = in;
    }       
    String line = null;
    public void start(){            
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));           
        try{
            while( (line=reader.readLine()) != null ){
                System.out.println(line);
            }
            reader.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

2

あなたのループを見てください:

while ((line = standard.readLine()) != null) {            
    System.out.println(line);
}
while ((line = error.readLine()) != null) {           
    System.out.println(line);
}

出力ストリームが完了するまで、出力ストリームからの読み取りを続けます。これは、プロセスが終了したときである可能性があります。そうして初めてエラー ストリームの読み取りを開始します。

両方のストリームから同時に読み取ることができるように、おそらくこれらの少なくとも 1 つを別のスレッドに配置する必要があります。

于 2012-11-22T16:56:36.037 に答える