告别复杂的流关闭

一、引言

也许大家在使用流时因为未关闭、或者未正常关闭引发了很多问题。其实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块里打开,这样在使用完毕之后,流会自动正确关闭,从此告别流关闭异常。

原文地址:https://www.cnblogs.com/9dragon/p/10839472.html

时间: 2024-10-22 05:18:18

告别复杂的流关闭的相关文章

Java IO流关闭问题的深入研究

转自:https://blog.csdn.net/maxwell_nc/article/details/49151005 前几天看了一篇文章(见参考文章),自己动手试了下,发现有些不一样结论,作博客记录下,本文主要研究两个问题: 包装流的close方法是否会自动关闭被包装的流?关闭流方法是否有顺序?包装流的close方法是否会自动关闭被包装的流?平时我们使用输入流和输出流一般都会使用buffer包装一下, 直接看下面代码(这个代码运行正常,不会报错) 1 import java.io.Buffe

Java流关闭总结

ava中流中引用close方法总结 1.由Java.io包中的对象生成实例的close方法使用情况 BufferedInputStream bis = new BufferedInputStream(new InputStreamReader(new FileInputStream())) BufferedInputStream类 public void close() throws IOException { byte[] arrayOfByte; while ((arrayOfByte =

java--io流关闭工具类

import java.io.Closeable; import java.io.IOException; public class IOUtils { public static void close(Closeable ...io){ for (Closeable closeable : io) { if(closeable!=null){ try { closeable.close(); } catch (IOException e) { e.printStackTrace(); } }

Java IO包装流如何关闭?

http://www.cnblogs.com/qqzy168/p/3670915.html —————————————————————————————————————————————————————— 问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: 如下例子代码: FileInputStream is = new FileInputStream("

流的关闭

一般情况下是:先打开的后关闭,后打开的先关闭另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b.例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b 可以只关闭处理流,不用关闭节点流,因为处理流关闭的时候,会调用其处理的节点流的关闭方法

Java socket中关闭IO流后,发生什么事?(以关闭输出流为例)

声明:该博文以socket中,关闭输出流为例进行说明. 为了方便讲解,我们把DataOutputstream dout = new DataOutputStream(new BufferedOutputStream(mySocket.getOutputStream()));中的dout做为Socket输出流的代言.同样的,din是输入流的代言. 可以造成dout被关闭的操作有: 1.调用dout.close();或din.close();因为使用这种流关闭,会造成socket被关闭,所以输入输出

io流的关闭顺序

一般情况:先打开的后关闭,后打开的先关闭: 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b. FileWriter fw = new FileWriter( "E:/data//车站一次.csv",true); BufferedWriter bufw = new BufferedWriter(fw); 关闭流(注意顺序): bufw.close(); fw.close(); 此处用BufferedWriter来包装FileWriter,所以应该先关闭bufw,然后

java IO包装流如何关闭

问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: 如下例子代码: FileInputStream is = new FileInputStream("."); BufferedInputStream bis = new BufferedInputStream(is); bis.close(); 从设计模式上看: java.io.Buffer

告别996 实现高效编程 减少开发压力

第1章 口号:打破996魔咒,向“资本家”开炮[我们的最高宗旨]有一种优秀,叫“告别996".本章开宗明义:一语道破课程的最高宗旨:告别996,打破996魔咒,不屈服于“资本家”淫威,为广大猿类提升工作效率,赢得个人时间,同时通过课程思维导图综述本课程内容丰富,必将让小伙伴们乘兴而来,兴尽而归.... 第2章 告别996之函数编程[让代码像撸串儿一样]你是否见过“撸”代码也可以像撸串儿一样?那么我们从函数式编程说起,通过学习本单元,使小伙伴们了解Lambda出现的意义和价值:会灵活使用:知晓使用