package com.ydlclass.feature;

import org.junit.Test;

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

public class IOTest {
   

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

                throw new IOException();
            }
            inputStream = new FileInputStream("E:\\CloudMusic\\MV\\焦迈奇 - 我的名字.mp4");
            File file = new File("E:\\CloudMusic\\MV\\new.mp4");
            if (!file.exists()) {
                file.createNewFile();
            }
            outputStream = new FileOutputStream("E:\\CloudMusic\\MV\\new.mp4");
            long start = System.currentTimeMillis();
            byte[] bytes = new byte[1024 * 1024];//将每次运货箱的大小提升;这样只需要进行比较少的i/o操作就可以完成;
            // 如果还想优化新能,那么可以使用多线程;或者使用nio

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

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

            //简单的优化
        } catch (IOException e){
            e.printStackTrace();
        } finally {//使用finally关键字完成系统资源的释放
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null){//注意判断输入输出流不能为空
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }
}