java - 嵌套资源获取是否需要在 Java 中进行特殊处理?
问题描述
首先,是的,try-with-resource 解决了这些问题中的任何一个......但如果没有它,我看不出它是如何工作的。
让我们以 java 文档中的这段代码为例,可以在 这里找到:
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
现在,如果资源br.close()
被获取,它就会被释放。然而,
- 如果
new FileReader(path)
成功然后new BufferedReader(...)
抛出异常会发生什么? - java如何保证
FileReader
关闭? - 是否保证
BufferedReader
在已打开的文件上创建FileReader
总是会成功?如果是这样,为什么该方法声明为抛出一个IOException
?
或者我们应该改为编写以下内容以确保不会发生这种情况?
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
FileReader fr;
try {
FileReader fr = new FileReader(path);
BufferedReader br;
try {
BufferedReader br = new BufferedReader(fr);
return br.readLine();
} finally {
if (br != null) br.close();
}
finally {
// Implements closeable, so it is ok if we call it twice.
if (fr != null) fr.close();
}
}
当然,使用 try-with-resources,这种嵌套的混乱仍然消失了,因为我们可以在同一个语句中声明多个资源。但我总是认为自己编写 try-with-resources 是为了避免完全考虑这种情况,并试图在网上找到我真的找不到的解决方案。
任何帮助将不胜感激,谢谢!
解决方案
close()
在for的实现中查看 java 源代码BufferedReader
。
* @see FileReader
* @see InputStreamReader
* @see java.nio.file.Files#newBufferedReader
*
* @author Mark Reinhold
* @since 1.1
*/
public class BufferedReader extends Reader {
private Reader in;
...
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close();
} finally {
in = null;
cb = null;
}
}
}
...
/**
* Creates a buffering character-input stream that uses an input buffer of
* the specified size.
*
* @param in A Reader
* @param sz Input-buffer size
*
* @exception IllegalArgumentException If {@code sz <= 0}
*/
public BufferedReader(Reader in, int sz) {
super(in);
if (sz <= 0)
throw new IllegalArgumentException("Buffer size <= 0");
this.in = in;
cb = new char[sz];
nextChar = nChars = 0;
}
/**
* Creates a buffering character-input stream that uses a default-sized
* input buffer.
*
* @param in A Reader
*/
public BufferedReader(Reader in) {
this(in, defaultCharBufferSize);
}
所以 close() 会处理 Reader(此处为 FileReader)并将其设置为 null。
简单BufferedReader br = new BufferedReader(new FileReader(path))
就好
嵌套资源获取是否需要在 Java 中进行特殊处理?
这里:没有
推荐阅读
- windows - 如何使用 FreeType 计算 Windows 位图字体的大小
- javascript - 如何在 flask.send_from_directory 处理时显示消息或加载动画?
- node.js - 使用 axios 获取 400 Bad Request 但与邮递员一起使用
- typescript - 以 esNext 为目标时,为什么我不能将 bigints 与 typescript 一起使用?
- javascript - 如何在 JSONPATH 中添加名称
- django-models - 为什么它显示“xhtml2pdf.w3c.cssParser.CSSParseError: Selector name or qualifier expected:: ('', '~ .checkmark{\n ba')”错误?
- javascript - 具有多个级别的nodejs中的异步序列
- python - 如何将带有数字和字母的字符串更改为整数
- docker - 容器无法发出网络请求 - x509:证书由未知机构签名
- pandas - 用索引和值的字典替换熊猫系列值