1.字符流的使用(字符流在文本中的使用效率稍微高效点)

2.字符的使用方式大致和字节流的使用方式想类似,最大的不同在于继承结构的不同;字符流继承read,write;

3.再次强调资源流使用完成之后需要释放资源,如果不释放资源,那么输出流可能不会将结果完全的刷回至磁盘上,有时可能导致复制完成之后的文件打开的内容为空;

4.出现这种可以调用输出流的flush()方法,如果是关闭流或默认调用此方法;如果使用前面的方法依旧没有完全的关闭资源流。

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 testCharStream(){
        try(Reader inputStream1 = new FileReader("D:\\Product.log");//保证能够自动关闭资源流
            Writer outputStream1 = new FileWriter("E:\\Product.log");)
        {
            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
            char[] chs = new char[1024*1024];
            int len;
            while ((len = inputStream1.read(chs)) != -1){
                outputStream1.write(chs);
            }
            long end = System.currentTimeMillis();
            System.out.println("单字节搬运:" + (end - start));

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

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

    }

}