最初に、SOコミュニティに謝罪してください。しかし、私はこの一日中、私のロープの終わりにいます。BufferedReaderを同時に使用して入力ストリームとエラーストリームを読み取るハング
Runtime.getrunTime()。exec()を使用して起動されたプロセスからの入力ストリームとエラーストリームからテキストをプルする必要があるプログラムのセクションがあり、それを標準入力と出力に渡します。規則的な方法。私は私が知ることができるように近くに働くはずの機能を持っています。しかし、それはストリームが準備ができているのを待っているcatch-22に巻き込まれているようですが、ストリームは終了し、報告しません。私はうんざりしている。私は自分の制約に合ったこれを行う別の方法を考えることはできません。そのようなキャッチ22が存在することができると私はむしろ懐疑的です。ここで
は私のコードです:
private void forwardStreamtoStd(InputStream in, InputStream err)
throws IOException {
int c = -1;
BufferedReader inReader = new BufferedReader(
new InputStreamReader(in, "US-ASCII"));
BufferedReader errReader = new BufferedReader(
new InputStreamReader(err, "US-ASCII"));
boolean inFinished = false, errFinished = false;
try {
System.out.println("Begin stream read loop...");
while (!inFinished && !errFinished) {
if (!inFinished) {
while (inReader.ready()) {
if ((c = inReader.read()) == -1) {
inFinished = true;
}
else {
System.out.print((char) c);
}
}
}
if (!errFinished) {
while (errReader.ready()) {
if ((c = errReader.read()) == -1) {
errFinished = true;
}
else {
System.err.print((char) c);
}
}
}
}
System.out.println("End stream read loop.");
}
catch (IOException e) {
throw e;
}
finally {
errReader.close();
inReader.close();
}
}
問題が読み取りループはストリームの準備ができて報告することを待っている、そしてその結果として-1を告げる読み取りによって返さ見ていないということのようですそれは終了する時間です。私はどちらかのストリームをブロックすることを避けようとしているので、準備が整ったら順番に両方から引き出すことができます。しかし、プロセスの終わりをどうやって捕まえることができますか?何か不足していますか?それがストリーム-1の終わりを持っているときに読み込まれたというレポートを読んではいけませんか?プロセスは終了しているので、ストリームが死んでいるはずです。私はここで間違って何をしていますか?