web-dev-qa-db-ja.com

Java

プログラムを終了する前に、FileInputStream(および一般にストリーム)いずれにしてもを閉じる必要があるのはなぜですか?そうでなければ何が起こりますか?入力ストリームがプログラムで明示的に閉じられる前にプログラムが停止した場合、ストリームも自動的に閉じませんか?

51
user42155

ファイルハンドルは、限られた限られたリソースです。データベース接続と同じように、適切にクリーンアップしないと、これらが不足する可能性があります。

ユーザーが1人だけの小さなプログラムを作成した場合は、だらしがなく、finallyブロックで閉じないようにすることができます。

しかし、多くのユーザーとファイルハンドルを持つアプリケーションでそのイディオムを使用してしまうと、問題が発生する可能性があります。

「最初に習慣を作る、それから彼らは私たちを作る」必要のないときでもベストプラクティスを適用するようにしています。

45
duffymo

はい、プロセスが終了すると、アンマネージリソースが解放されます。 InputStreamsの場合、これで問題ありません。 OutputStreamsの場合、バッファリングされたデータが失われる可能性があるため、プログラムを終了する前に少なくともストリームをフラッシュする必要があります。

36
Jon Skeet

おい。ストリームを閉じないと、ユニットテストは失敗します。または、少なくともそうするべきです。だから、それを閉じる必要があるのはそのためです。 ;)

また、終了するだけでOSはほぼ確実にクリーンアップされますが、明示的に閉じると、通常はより早く解放されます。さらに、コードが長期にわたって実行されるプログラムになってしまうとどうなりますか?それから彼らは問題を抱えてあなたを呪います。 :(

つまり、トイレを使った後に手を洗うようなものです。あなたがそれをしなければ、最終的に誰かが代価を支払うでしょう。しばらくの間それでうまくいくでしょうが、それはまだ良い習慣です。

25
Don Branson

Jonの回答に加えて、一般的にリソースを閉じることをお勧めします。

データベース接続について考えてください。データベースで無限接続を開くことはできません。この場合、不要な場合は、使い終わったらすぐに閉じることをお勧めします。

これを習慣にするのも良いことです。 「ついに」ブロックはあなたの友達です。 C++の場合、 RAIIでこれを自動的に管理する を使用することもできます。

10
Srikanth

ちょっと。ストリームは「実際の」オペレーティングシステムファイル記述子によってサポートされており、プロセスが終了すると、OSは開いているファイル記述子をクリーンアップします。

とにかく、完了したら常にリソースを閉じることをお勧めします。したがって、ストリームを閉じてください:)

7
Joao da Silva

ストリームを閉じないと、再び開くときに問題が発生する可能性があります。これは、ソケットの端にぶら下がっている場合に特に当てはまります。

ストリームを閉じると、送信するデータが残っている場合に、ストリームを介してデータが確実にフラッシュされます。

6
Philip Reynolds