告别复杂的流关闭
程序员文章站
2022-07-10 23:50:00
一、引言 也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实java7引入了自动关闭流机制,只是我们未使用而已。 二、自动关闭流例子 public class AutoCloseTest { public&nb ......
一、引言
也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实java7引入了自动关闭流机制,只是我们未使用而已。
二、自动关闭流例子
public class autoclosetest {
public static void main(string[] args) throws ioexception {
//将打开流代码放到try中
try (
bufferedreader br = new bufferedreader(
new filereader("teacher.txt"));
printstream pr = new printstream(new fileoutputstream("a.txt"))
) {
//使用两个资源
system.out.println(br.readline());
pr.println("我是要成为海贼王的男人");
}
}
}
我们直接将打开的流对象放到try的圆括号中,这样当流使用完毕时,会自动将流进行关闭。这样不仅省事而且避免了自行关闭可能带来的错误。
三、探究原理
这么神奇吗?让我们来掀开这层神秘面纱,看看是何方妖孽在此“作祟”。通过jd-gui工具,我们打开
class文件看看。
public class autoclosetest
{
public static void main(string[] args)
throws ioexception
{
bufferedreader br = new bufferedreader(new filereader("teacher.txt"));throwable localthrowable6 = null;
try
{
printstream pr = new printstream(new fileoutputstream("a.txt"));throwable localthrowable7 = null;
try
{
system.out.println(br.readline());
pr.println("我是要成为海贼王的男人");
}
catch (throwable localthrowable1)
{
localthrowable7 = localthrowable1;throw localthrowable1;
}
finally {}
}
catch (throwable localthrowable4)
{
localthrowable6 = localthrowable4;throw localthrowable4;
}
finally
{
if (br != null) {
if (localthrowable6 != null) {
try
{
br.close();
}
catch (throwable localthrowable5)
{
localthrowable6.addsuppressed(localthrowable5);
}
} else {
br.close();
}
}
}
}
}
厉害了,jvm帮我们做的更好,大家可以参考下之前自己写的关闭流程有没有问题。自动关闭流程也是一样的,先关闭后打开的流,因为如果先关闭先打开的,如果后打开的在使用先打开的,这就会引发异常。
为什么会自动关闭呢?
这是因为java7引入了一个autocloseable接口。几乎java自带的所有使用到流的都实现了这个接口。下面是继承图。
四、总结
我们可以通过使用java7引入的自动关闭机制,将实现了autocloseable接口的流放到try块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。
上一篇: dubbo源码阅读之集群(故障处理策略)