14

テキスト ファイルから読み取る場合、通常は を作成しFileReader、それを にネストしBufferedReaderます。読み終わったら、2 つのリーダーのどちらを閉じる必要がありますか? それは問題ですか?

FileReader fr = null;
BufferedReader br = null;
try
{
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    // ...
}
finally
{
    // should I close fr or br here?
}

例外安全性に関しては、私は少し妄想的です。BufferedReaderコンストラクターが例外をスローするとどうなりますか? ネストされたリーダーを閉じますか? それとも、投げないことが保証されていますか?

4

5 に答える 5

10

一般close()に、最も外側のストリームで、ラッパーはラップさclose()れたストリームを呼び出します。ただし、コンストラクターが例外をスローする可能性が高いと思われる場合は、Closeableインターフェイスを自由に使用してください。

FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
    BufferedReader br = new BufferedReader(fr);
    res = br;
} finally {
    res.close();
}

したがって、JVM がバッファー用のヒープ領域を使い果たし、エラーをスローしたとしても、ファイル ハンドルがリークすることはありません。

Java 7 以降では、try-with-resources を使用します。

try (FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)) {
  // do work
}
于 2011-02-05T19:37:25.093 に答える
0

だけを閉じるだけBufferedReaderで十分FileReaderです。ソースコードを見るBufferedReaderと、closeメソッドがラップされたストリームを閉じることがわかります。

于 2011-02-05T19:30:32.897 に答える
0

finally ブロックで BufferedReader を閉じます。

于 2011-02-05T19:31:31.470 に答える
0

BufferedReader の close メソッドを呼び出すと、BufferedReader は FileReader の close メソッドを呼び出します。したがって、両方の close メソッドが呼び出されます。より正確には、BufferedReader は何もしませんが、 FileReaderの close メソッドを呼び出します。したがって、それはまったく問題ではありません。BufferedReader の close メソッドを呼び出すのも良い方法だと思いますが。

于 2011-02-05T19:38:06.117 に答える
0

スローしないという保証はありません。バッファーが割り当てられているため、OutOfMemoryError がスローされる場合があります。私は通常、コードを 2 つのセクションに分けます。リソースを取得してからリソースを使用します。通常、各セクションには固有のクリーンアップのニーズがあります

説明するコードは次のとおりです。

// Acquire resources section.

final FileReader fr = new FileReader( fileName );

BufferedReader br = null;

try
{
    br = new BufferedReader(fr);
}
finally
{
    if ( br == null )
    {
        // Note that you are closing the fr here
        fr.close( );
    }
}

// Use resources section
try
{
    // ... use br
}
finally
{
    // Now that br is safely constructed, just all its close
    br.close( );
}

そして、私はあなたに同意します。長時間実行されているサーバー アプリケーションで、静かにファイル ハンドラーを解放することほど価値のあることはありません。

于 2011-02-05T21:00:54.840 に答える