Java自动关闭流
背景
也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实java7引入了自动关闭流机制,只是我们未使用而已。
自动关闭流例子
import java.io.*; public class AutoCloseTest { public static void main(String[] args) throws IOException { //将打开流代码放到try中 try ( BufferedReader br = new BufferedReader(new FileReader("t.txt")); PrintStream pr = new PrintStream(new FileOutputStream("a.txt")) ) { //使用两个资源 System.out.println(br.readLine()); pr.println("我是要成为海贼王的男人"); } } }
我们直接将打开的流对象放到try的圆括号中,这样当流使用完毕时,会自动将流进行关闭。这样不仅省事而且避免了自行关闭可能带来的错误。
打开该源码文件对应的class文件反编译后可以看到
import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; public class AutoCloseTest { public AutoCloseTest() { } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new FileReader("t.txt")); Throwable var2 = null; try { PrintStream pr = new PrintStream(new FileOutputStream("a.txt")); Throwable var4 = null; try { System.out.println(br.readLine()); pr.println("我是要成为海贼王的男人"); } catch (Throwable var27) { var4 = var27; throw var27; } finally { if (pr != null) { if (var4 != null) { try { pr.close(); } catch (Throwable var26) { var4.addSuppressed(var26); } } else { pr.close(); } } } } catch (Throwable var29) { var2 = var29; throw var29; } finally { if (br != null) { if (var2 != null) { try { br.close(); } catch (Throwable var25) { var2.addSuppressed(var25); } } else { br.close(); } } } } }
jvm帮我们做的更好,大家可以参考下之前自己写的关闭流程有没有问题。自动关闭流程也是一样的,先关闭后打开的流,因为如果先关闭先打开的,如果后打开的在使用先打开的,这就会引发异常。
为什么会自动关闭
因为java7引入了一个AutoCloseable接口。几乎java自带的所有使用到流的都实现了这个接口。下面是继承图。
总结
Java版本支持的情况下,可通过使用java7引入的自动关闭机制,将实现了AutoCloseable接口的流放到try块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。
本文作者:wang_longan
本文链接:https://www.cnblogs.com/longan-wang/p/14871100.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步