1

私はmailxRuntime.execを介してコマンドを実装していて、それを実行する正しい方法を説明するこの記事に出くわしました。

JavaWorld:Runtime.exec

私は例を見てきましたがStreamGobbler、InputStreamを受け入れて出力を出力する新しいクラスが導入されていることがわかりました。しかし、これが導入された理由がわかりません。誰か説明してもらえますか?

また、私のコードの一部として、私は次のように書いています

OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream())
osw.write(mailBody)
osw.close

この実装は正しいですか、それとも落とし穴がありますか?

4

3 に答える 3

1

プログラムは成功する可能性がある(つまり、プログラムの出力がで利用できるProcess' getInputStream())か、失敗する可能性がある(つまり、プログラムのエラーがで利用できる)Process' getErrorStream()ので、これらを並行して読み取ることができるはずです。したがって、クラスによって実装される別のスレッドStreamGobbler。これがある程度明確になることを願っています。

于 2012-09-04T05:30:55.323 に答える
0

StreamGobblerソリューションを使用せず、単にgetInputStream()プログラムによって生成された標準出力を取得するために使用するとします。InputStreamプログラムの実行で標準エラー出力のみが生成される場合、によって返されたを読み取ろうとすると、Javaコードがハングする可能性がありますgetInputStream()。実行環境によって動作が異なる可能性があるため、「ハングする可能性があります」と言います。JUnitテストを実行しているときに、この問題が発生しました。

于 2013-03-11T20:45:10.237 に答える
0

ProcessBuilderには、エラーストリームを入力ストリームにリダイレクトするメソッド(ProcessBuilder.redirectErrorStream)があるため、ストリームを並行して読み取るために別のスレッドは必要ありません。ただし、InputStream.readはブロックされる可能性があり、Thread.interruptを介して割り込み可能ではないため、読み取りにタイムアウトを設定する必要がある場合は、別のスレッド「StreamGobbler」を使用することをお勧めします。

于 2017-04-13T16:22:34.243 に答える