告别复杂的流关闭
2019-05-09 16:51
537 查看
一、引言
也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实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块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。
相关文章推荐
- web开发内嵌tomcat的使用,告别复杂的配置
- 昼猫笔记 从此告别复杂代码--JavaScript
- 【转】Pitaschio: 右键单击关闭窗口, 告别 bbskin
- 告别复杂WCF扩展 REST过程 ,让他 so easy
- 【iOS 1 行代码系列】之 一行代码告别复杂视图的 delegate 和 block
- 彻底告别Connectify -> 命令行开启/关闭win7热点
- 【复杂网络资料】实证网络数据和各种程序源码
- C#实现复杂XML的序列化与反序列化
- cxf处理一些Map等复杂类型
- Shell 关闭的右上角按钮添加事件
- 使用DOS命令找到占用80端口的程序,关闭该程序
- InstallShield中通过修改注册表关闭Vista/Windows 7的UAC
- H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位
- 复杂业务逻辑注意的几个点
- Linux下Oracle的启动和关闭
- 大数据量表的复杂查询
- Android 中 PopupWindow 响应返回键并关闭的问题
- IT复杂吗?
- CopyFile(CopyFileEx)复制.mov大文件时关闭文件后文件没有复制完全
- JDBCTools 工具类(c3p0连接池获取连接,关闭连接,基本事务)