fre*_*low 13 java file-io stream resource-management try-finally
从文本文件中读取时,通常会创建一个FileReader然后将其嵌入到文本文件中BufferedReader.我读完后应该关闭哪两个读者?有关系吗?
FileReader fr = null;
BufferedReader br = null;
try
{
fr = new FileReader(fileName);
br = new BufferedReader(fr);
// ...
}
finally
{
// should I close fr or br here?
}
Run Code Online (Sandbox Code Playgroud)
在涉及异常安全方面,我有点偏执.当BufferedReader构造函数抛出异常时会发生什么?它是否关闭了嵌套的阅读器?还是保证不扔?
McD*_*ell 10
通常,close()在最外层的流包装器上将调用close()包装的流.但是,如果您认为构造函数可能会抛出异常,请自由使用Closeable接口.
FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
BufferedReader br = new BufferedReader(fr);
res = br;
} finally {
res.close();
}
Run Code Online (Sandbox Code Playgroud)
因此,即使JVM用尽缓冲区的堆空间并引发错误,也不会泄漏文件句柄.
对于Java 7及更高版本,请使用try-with-resources:
try (FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr)) {
// do work
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1882 次 |
| 最近记录: |