BufferedReader可以在Java中自动关闭吗

Posted

技术标签:

【中文标题】BufferedReader可以在Java中自动关闭吗【英文标题】:Can BufferedReader be closed automatically in Java 【发布时间】:2014-02-03 13:20:11 【问题描述】:

我收到有关资源泄漏的警告(BufferedReader 未关闭)。我通过在 Return 语句之前放置一个 close 语句并运行程序来解决这个问题。但我得到了一个 NullPointerException。我的问题是文件读取完成后是否可以自动关闭(以某种方式)。不过这个question 看起来很相似。

【问题讨论】:

IOUtils.closeQuietly()finally ***.com/questions/17739362/… 我修复了我的代码,但只是想知道资源是否可以以某种方式自动关闭。 【参考方案1】:

您可以使用 try-with-resources Java 7 功能:

try(BufferedReader rdr = new BufferedReader(...)) 
     ...

退出区块时会自动关闭

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

【讨论】:

有趣!谢谢@Evgeniy【参考方案2】:

在 Java 7 之前,可关闭 IO 资源的一般模式如下:

Resource r = null; // either stream, reader, writer etc
try  
    r = ... // create resource
    use resource r
 catch(IOException e) 
   // some code
 finally 
    if (r != null) 
         r.close();
    

资源用于finally块,保证无论操作成功还是失败都会关闭。如果在创建资源时抛出了IOException,则需要null-check 来防止NPE。

Java 7 引入了新语法,会产生资源“自动”关闭的错觉:

try (
    Resource r = // create resource
) 
    use resource r
 catch(IOException e) 
   // some code
 

finally 块实际上是由编译器自动添加到这里的。

我希望这能回答您关于自动关闭BufferedReader 的问题。

【讨论】:

以上是关于BufferedReader可以在Java中自动关闭吗的主要内容,如果未能解决你的问题,请参考以下文章

JAVA之旅(二十五)——文件复制,字符流的缓冲区,BufferedWriter,BufferedReader,通过缓冲区复制文件,readLine工作原理,自定义readLine

BufferedReader关闭不掉

在Java中,BufferedReader 是一个啥类啊,有啥作用啊

在 Java 中使用 BufferedReader 重置缓冲区?

java中的BufferedReader语句如何用?

java IO,bufferedReader类