2012-03-02 9 views
2

このFileReaderはどのように「クローズ」になりますか?

public static void main(String[] a) throws IOException { 

    FileReader f = new FileReader(a[0]); 

    System.out.println(f.ready()); // true 

    doSomethingWithReader(f); 

    System.out.println(f.ready()); // false 
} 

private static String doSomethingWithReader(FileReader reader) { 

    BufferedReader br = null; 

    try { 
     br = new BufferedReader(reader); 
     ... 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    return line; 
} 

FileReaderのは、どこにも閉じられていない次の一連のイベントを考えてみたが、何がそれを閉じて?

+0

ラップされたBufferedReaderは、closeメソッドの動作がラッパーツリーを伝播するため、クローズするとクローズします。 –

+1

BufferedReaderがそれを閉じます。興味深いことに、これは、[javadoc](http://docs.oracle.com/javase/6/docs/api/java/io/Reader.html#close%28%29)の 'close ()は、 "任意のシステムリソースを解放する"と述べていますが、具体的には書いていません... – DNA

+0

@DNA正確に:)私は 'BufferedReader' javadocを見ましたが、デバッグを開始するまで接続できませんでした。 – JAM

答えて

9

これは、ラッパーとして使用できるすべての標準のReader、Writer、OutputStream、およびInputStreamクラスに当てはまります。

3
br.close(); 

あなたの読者を閉じます。あなたにもFileReaderの基礎となる/ラップを閉じますBufferedReader.close()を呼び出し、BufferedReaderFileReader(または任意のReader)をラップ

0

BufferedReaderを閉じると、Readerが閉じます。この場合は、FileReaderです。

0

finallyブロックは、例外がスローされたかどうかに関係なく実行されます。 finallyブロックでは、ファイルリーダーをラップするバッファされたリーダーを閉じます。バッファされたリーダーを閉じると、ファイルリーダーによって使用されるストリームを含むすべての基本ストリームが閉じられます。

0

BufferedReaderのドキュメントによると、brを構築するために使用されるFileReaderは、br(finallyブロック内)を閉じるときにも閉じられます。

+0

正しいとはいえ、私は[javadoc](http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#close%28%29)がこれを言っているとは思わない少なくともあまり明確ではない... – DNA

2

implementation of BufferedReaderを見てください:[オープンJDK7実装]

public void close() throws IOException 

{ 
     synchronized (lock) { 
      if (in == null) 
       return; 
      in.close(); 
      in = null; 
      cb = null; 
     } 
} 

それはあなたのための基礎となるFileReaderをINGのclose()の世話をします。

+0

+1 for RTFS。に入るための素晴らしい練習! –

関連する問題