BufferedReader正确使用

时间:2017-11-23 12:50:39

标签: java bufferedreader

我使用以下样式来读取带有BufferedReader的文件

try (BufferedReader br = new BufferedReader(new FileReader("my_file"))) {
  ...
  br.close();
} catch( IOException e ) {
  System.out.println( e.getMessage() );
} 

我想知道的事情:

1- close()是否在正确的位置?

2-我应该把另一个try..catch换成'close()吗?

3-由于new使用了br,是否足以调用close()或者我必须为GC编写br = null

4- FileReader已被new编辑,我应该销毁吗?

4 个答案:

答案 0 :(得分:4)

  1. 由于您使用try-with-resource语句,因此无需明确关闭流。它在任何情况下都会自动关闭。如果你没有使用try-with-resource,那么close()就会出错。要确保您的资源始终处于关闭状态,您需要在finally
  2. 中调用close()
  3. 如果在finally块中调用close(),则需要捕获由它抛出的已检查的Exception。如果你使用try-with-resource(就像你一样),你很好
  4. 所有变量仅存在于try块的范围内,因此您是安全的
  5. BufferedReader关闭装饰的Reader,因此您不必明确地将其关闭

答案 1 :(得分:2)

您在代码中使用try-with-resources语句。在此示例中,try-with-resources语句中声明的资源是BufferedReader。声明语句出现在try关键字后面的括号内。 BufferedReader中的Java SE 7 and later类实现了接口java.lang.AutoCloseable。由于BufferedReader实例是在try-with-resource语句中声明的,因此无论try语句是否完成正常,它都将关闭突然即可。您可以从documentation了解有关此声明的更多信息。所以,这里是修改版本:

try (BufferedReader br = new BufferedReader(new FileReader("my_file"))) {
  // your logic

} catch (IOException e) {
  System.out.println(e.getMessage());
} 

答案 2 :(得分:2)

您正在使用try-with-resources声明。您无需在Reader上显式调用close。事实上,文件说明了:

  

try-with-resources语句确保在语句结束时关闭每个资源。实现java.lang.AutoCloseable的任何对象(包括实现java.io.Closeable的所有对象)都可以用作资源。

此外,您的FileReader由BufferedReader修饰,关闭BufferedReader应关闭FileReader。

答案 3 :(得分:0)

1-2-最好与finally或资源块一起使用close。否则,如果之前发生异常,则不会调用close。

3-调用close()就足够了。将对象设置为null不会删除引用。当对象不再引用时,GC将销毁对象。所以不要手动破坏你的对象。