2012-03-02 95 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将关闭它传播了包装的树。 – 2012-03-02 23:08:00

+1

BufferedReader关闭它。有趣的是,对于'close而言,[javadoc](http://docs.oracle.com/javase/6/docs/api/java/io/Reader.html#close%28%29)并不完全清楚这一点。 ()',其中说“释放任何系统资源”,但没有详细说明... – DNA 2012-03-02 23:08:08

+0

@DNA正确:)我看着'BufferedReader' javadoc,但直到我开始调试后才能建立连接。 – JAM 2012-03-02 23:12:45

回答

9

当您缠绕一个FileReader(或任何Reader)与BufferedReader,呼吁BufferedReader.close()将关闭包裹/底层FileReader为好。

这是所有可作为包装标准的读者,作家,为OutputStream和InputStream的类也是如此。

3
br.close(); 

关闭您的阅读器。

0

关闭BufferedReader也关闭它封装了Reader,所以在这种情况下,这就是FileReader

0

无论是否引发异常,finally块都会执行。在您的finally块中,关闭包装文件读取器的缓冲读取器。关闭缓冲读取器将关闭所有基础流,包括文件读取器使用的流。

0

根据BufferedReader中的DOC,的FileReader用来构建BR当您关闭BR(finally块)也得到关闭。

+0

虽然正确,但我不认为[javadoc](http://docs.oracle.com/javase/6/docs/api/java/io/BufferedReader.html#close%28%29)对此表示:至少不是很清楚... – DNA 2012-03-02 23:18:40

2

看一看的implementation of BufferedReader:[开JDK7实现]

public void close() throws IOException 

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

它关心close()荷兰国际集团为你的潜在FileReader

+0

RTFS +1。一个伟大的做法,进入! – 2012-03-02 23:26:04