前言

在jdk1.7以前,io的操作都是要关流的,而经常有些码农就会忘记关流(比如说我),从而造成资源的浪费,降低系统性能。但值的高兴的是,在jdk1.7以后就不用关流了,流会自动关闭,,这样一来,我们就不用担心关流的问题了。就在刚出版的jdk1.9中又对jdk1.7中的方式又做新的更新,先不急了解新写法,我们先从jdk1.7之前出现,看看之前关流的做法是怎样的。

tip:如果想使用这种糖语法关流,就必须实现AutoColseable接口,才可以自动关流

AutoColseable接口源码:

public interface AutoCloseable {
    void close() throws Exception;
}

JDK1.7之前关流方式

jdk1.7之前,在finally块(并不一定要在finally块中)中执行close()方法,关闭流并释放与该流关联的所有系统资源。这样一来,每打开一个连接,就要关一次连接。

public static void testBuffered(File file) throws IOException {
 
        BufferedInputStream bis = null;
        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            byte[] b = new byte[bis.available()];
            bis.read(b);
            System.out.println("使用缓冲字节输入流读取到的结果如下:"+new String(b));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            bis.close();
        }
}

或者使用工具包,稍微简洁一些:

InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader read=null;
        try {
         is = new FileInputStream(new File(""));
         isr = new InputStreamReader(is);
         read = new BufferedReader(isr);
         String s = read.readLine();
        } finally {
            IOUtils.closeQuietly(read,isr,is);
        }

JDK1.7新语法

在JDK1.7以前,Java没有自动关闭外部资源的语法特性,直到JDK7中新增了try-with-resource语法,才实现了这一功能。简单的demo我也写了一个,放在下面...

public class Java7 {


    public static void main(String[] args) {
 
        File file = new File("D:"+File.separator+"test.txt");
        try(FileInputStream fis = new FileInputStream(file);){
          byte[] b = new byte[fis.available()];
          fis.read(b);
          System.out.println("文件读取内容如下:"+new String(b));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

只要把需要关流的操作写在try()中就可以不用关流,不需要关流的操作(准确来说是没有实现AtuoColseable接口的类),不能写在try()中,否则报错。

JDK1.9新语法

JDK9发布后,又简化了try-with-resources语句的用法。try()里面可以是一个变量,但必须是final的或者等同final才行。如下面的mis,mos定义成局部变量可以不用final,局部变量可以等同于final,但定义成成员变量就必须是用final修饰的,不然会编译错误。

MyInputStream mis = new MyInputStream();
MyOutputStream mos = new MyOutputStream();
try (mis; mos) {
    mis.read("1.9");
    mos.write("1.9");
} catch (Exception e) {
    e.printStackTrace();
}

简略的谈一下个人对9的语法的感觉,总体来来说,比7的版本的中的语法看的让人更舒服,然后就是没有什么太大的区别了。说白了这些语法糖,表面上我们没有手动关流,其实在运行期间,还是调用close()方法进行关流的,只是这一步不用我们去做了。

总结

闲话不多扯,做个总结,总之要想实现自动关流,还是想看连接类有没有实现AutoColseable这个接口,具体可以查看源码,这里不作详细解释。