You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中嵌套创建的Reader与Writer流如何正确关闭?

Java流关闭操作的常见疑问解答

嘿,我来帮你把这些流关闭的问题讲明白~

1. 读取场景下的流关闭

你完全不需要同时调用reader.close()和r.close()!只需要关闭最外层的包装流BufferedReader r就足够了。

原因很简单:Java的包装流(比如BufferedReader)在实现close()方法时,内部会自动调用底层被包装流(这里就是FileReader)的close()方法。也就是说,当你执行r.close()的时候,它会先清理自己的缓冲资源,然后自动帮你把底层的reader也关闭掉。

反过来,如果先关闭底层的FileReader,再操作BufferedReader反而会抛出IO异常,所以正确的姿势是只关闭最外层的包装流。

额外推荐:用try-with-resources自动管理资源

从Java 7开始,推荐使用try-with-resources语法,它能自动帮你关闭所有实现了AutoCloseable接口的资源(几乎所有Java IO流都实现了这个接口),根本不用手动写close()方法,既安全又省事:

try (FileReader reader = new FileReader(filetoread);
     BufferedReader r = new BufferedReader(reader);
     FileWriter writer = new FileWriter(filetowrite);
     PrintWriter writerpw = new PrintWriter(writer);
     StreamTokenizer st = new StreamTokenizer(r)) {
    // 在这里执行你的读写逻辑
} catch (IOException e) {
    // 处理IO异常
}

当try代码块执行完毕(不管是正常结束还是抛出异常),所有在try括号里声明的资源都会被自动按顺序关闭,完全不用担心遗漏或者关闭顺序错误的问题。

关于写入流的补充(顺带提一句)

你的写入流PrintWriter writerpw和FileWriter writer也是同样的逻辑:关闭writerpw就会自动关闭底层的writer。不过要注意,PrintWriter的close()方法会先自动调用flush(),所以不用手动刷缓冲,直接关最外层的PrintWriter就行。

内容的提问来源于stack exchange,提问作者Armin Beda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:44:01