3

私の Java コードでは、新しいプロセスを開始し、その入力ストリームを取得して読み取ります。

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

FindBugs はここでエラーを報告します:

may fail to close stream
Pattern id: OS_OPEN_STREAM, type: OS, category: BAD_PRACTICE

別のプロセスの InputStream を閉じる必要がありますか? さらに、その Javadocによると、 InputStream#close() は何もしません。これは偽陽性ですか、それとも完了したらプロセスの入力ストリームを本当に閉じる必要がありますか?

4

3 に答える 3

5

この場合、close()Readerになるストリームを閉じます。はい、ストリームを閉じることは常に良い習慣です。その時点で、見ている実装が何もしないことがわかっている場合でも (ただし、実際には、ここでは実行されます!)。それが後で変わったら?

FindBugs は、考えられるエラーについて警告するためだけに存在します。常に確実に知ることはできません。

最後に、Java プロセスは、生成したプロセスとProcessオブジェクトを所有しています。あなたは間違いなくそれと出力ストリームを閉じる必要があります. 他の誰もそれらを使用していません。また、OS 関連のストリームのおかしなビジネスを回避するために、そのようなことを行うことが重要です。

于 2010-04-03T10:23:58.157 に答える
4

InputStreamは抽象クラスです。その実装が何もしないからといって、によって返されるオブジェクトの実際の型がそうではないというわけではprocess.getInputStream()ありません。

この特定のケースで入力ストリームを閉じなくても害はない可能性がありますが、私は個人的にはそれを期待していません. 他の入力ストリームを閉じるのと同じように閉じます。他のことは別として、それはコードを他のものから読み取るように変更することにした場合に備えて、コードをより堅牢にします-代わりにファイルから読み取るのは(言うと)非常に簡単で、閉じていないことに気付かないでしょう. FileInputStream。_

于 2010-04-03T09:55:08.290 に答える
0

開いているすべてのストリームを閉じることは、常に良い習慣だと思います。できれば finally{} ブロックで。Java が言うように何もしないので、close() メソッドを呼び出してみませんか。害はありません。

于 2010-04-03T09:55:35.777 に答える