1.资源的释放完全可以实现自动关闭,jdk1.7之后,对于有些资源类实现了AutoClosable接口可以实现自动释放资源;

2.对于输入输出流的定义在try中的()来定义

3.用法(自动释放输入输出流的资源)

package com.ydlclass.feature;

import org.junit.Test;

import java.io.*;
import java.util.Random;

public class IOTest {
    String tarPath;

    public String getTarPath() {
        return tarPath;
    }

    public void setTarPath(String tarPath) {
        this.tarPath = tarPath;
    }

    @Test
        //正确的处理异常,并且对已经使用完毕的流资源关闭,释放系统的资源
        public void testCopyFileAutoClosable(){
            try(InputStream inputStream1 = new FileInputStream("E:\\CloudMusic\\MV\\焦迈奇 - 我的名字.mp4");
                    OutputStream outputStream1 = new FileOutputStream("E:\\CloudMusic\\MV\\new.mp4");)
            {
                if (new Random().nextInt(10) > 2){//随机值大于2时,由于抛出异常,之后的内容不会被执行;
                    //但是finally关键字之后的内容会接着执行,但是输入数输出流为null,所以可能会报出空指针异常的问题;

                    throw new IOException();
                }
                File file = new File("E:\\CloudMusic\\MV\\new.mp4");
                if (!file.exists()) {
                    file.createNewFile();
                }

                long start = System.currentTimeMillis();
                byte[] bytes = new byte[1024 * 1024];//将每次运货箱的大小提升;这样只需要进行比较少的i/o操作就可以完成;
                // 如果还想优化新能,那么可以使用多线程;或者使用nio

                int len;
                while ((len = inputStream1.read(bytes)) != -1) {
                    outputStream1.write(bytes, 0, len);
                }
                long end = System.currentTimeMillis();
                System.out.println("单字节搬运:" + (end - start));

                //上面的io是通过一个字节一个字节的读取文件,即使是8m左右大小的文,耗时大概是60分钟,可见io的效率不高;

                //简单的优化
            } catch (IOException e){
                e.printStackTrace();
            }

        }

}