1

私は次のコードを持っています:

public void disconnect()
{
    running = false;
    if(thread != null)
        thread.interrupt();
    thread = null;

    try
    {
        socket.close();
    }catch(Exception e){e.printStackTrace();}
}

ストリームから入力を収集するBufferedReaderと、出力ストリームを介してメッセージを送信するPrintWriterがあります。ソケットを閉じる前に、BufferedReaderとPrintWriterを閉じる必要がありますか?I / Oストリームを開いたままにしておくのは悪いことですか?

4

4 に答える 4

4

Javaネットワーキングチュートリアルによると

「ソケット自体を閉じる前に、ソケットに接続されているストリームをすべて閉じる必要があります。」

于 2012-06-15T00:32:46.007 に答える
4

出力ストリームを閉じて、フラッシュされるようにする必要があります。これにより、ソケットと入力ストリームの両方が閉じます。それらのいずれかを閉じると、他の2つが閉じます。入力ストリームを閉じる必要はまったくありません。安全のために厳密に言えば、おそらく、finallyブロックでソケット自体も閉じる必要があります。

于 2012-06-15T01:23:25.223 に答える
1

を閉じないと、BufferedWriterバッファリングされているがフラッシュされていないデータが失われる可能性があります。

PrintWritersを飲み込むので、使用すべきではない、または使用する場合は注意する必要があるという考え方もありますIOException

于 2012-06-15T00:29:50.583 に答える
0

開くすべてのストリームはOSリソースを使用します。ストリームでcloseを呼び出すと、ガベージコレクションのマークが付けられ、GC後にメモリが解放されます。ストリームを閉じない場合、GC(http://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html#close%28%29)によって閉じられますが、 GCがそのオブジェクトにヒットするのはいつか、まったく明確ではありません。

したがって、ストリームを閉じてメモリを即座に解放することをお勧めします。

于 2012-06-15T00:30:37.507 に答える