我使用以下样式来读取带有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
编辑,我应该销毁吗?
答案 0 :(得分:4)
close()
就会出错。要确保您的资源始终处于关闭状态,您需要在finally
块答案 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将销毁对象。所以不要手动破坏你的对象。