java文件复制-字符流

Posted 小女子不才~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java文件复制-字符流相关的知识,希望对你有一定的参考价值。

前记:欠下的迟早是要还的~~还债第二篇!

上一篇文章讲了使用字节流复制,这一篇主要解释字符流复制文件。最后有字节流和字符流的区别。

字符流的体系

抽象顶层父类:Reader(读取)和Writer(写入)

字符流具体子类:FileReader和FileWriter

Reader的常用方法

  • close
  • read()
  • read(char[] arr):一次读取一组字符放到arr中,返回值表示放到数组中的字符个数

Writer的常用方法

  • close
  • flush
  • 字符流拷贝效率提升write(int c):写出一个字符
  • write(String str): 写出一个字符串
  • write(char[] arr):
  • write(char[] arr,int offset,int len):

都是抽象类,不能实例化,需要使用子类对象来调用方法

字节流处理字符问题

  • 需要先把字符变为字节数组,才能写到目标文件中

字节读取字符

  • 纯英文,每次读取一个字节
  • 纯中文,每次读取两个字节(GBK) UTF-8一次读取3个
  • 中英文混杂,每次不知道要读取多少字节

字符流的拷贝使用场景:

  • 如果在读取字符之后,需要人为阅读,或修改之类,就有必要使用字符流了
  • 如果只单纯的文件拷贝,就不需要使用

字符流不能操作流媒体文件:当字符流读取到字节信息,先查询编码表,将其转为字符信息,如果是非纯文本文件了,就有可能读取的字节信息无法转为对应的字符,因为字节信息在编码表中查不到,就会使用?来替代,再输出时,就能查到?的编码,则导致了字节信息被篡改,导致文件不可用

字符流拷贝效率提升同字节流,使用FileReader的read(char[] arr)一次读取一个小数组的字符,能减少io的次数,提高读取效率,同样FileWriter write(char[] arr) 一次写出一个小数组,增加效率。

@Test
public void copyBystr(){
    try {
        //创建一个读入字符流
        FileReader reader=new FileReader(new File("D:\\\\test\\\\test.txt"));
        //创建一个输出字符流
        FileWriter writer=new FileWriter(new File("d:\\\\test\\\\test33.txt"));
        //定义读入,输出缓冲流 ,传
        //创建一个搬运工具
        char data[]=new char[20];
        //创建 长度
        int len=0;
        long start = System.currentTimeMillis();
        //从缓冲流中读取 表示从该输入读取最1024*8字节的数据流到字节数组data[]中
        while((len=reader.read(data))!=-1){
            writer.write(data,0,len);//从指定字节数组data写入len字节从偏移off开始到此文件输出流,off=0,因为write里默认事append
        }
        long end = System.currentTimeMillis();
        System.out.println("复制文件耗时:"+(end-start));
        //关闭流的时候 ,后开的先关
        reader.close();
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

字符的高效缓冲流

和字节同理,只不过数组换成了char

  • BufferedReader
  • BufferedWriter

高效缓冲流特有的方法

BufferedReader

  • readLine(): 可以从流中,一次读取一行文本,返回一个String对象,读取到末尾的时候返回null;

BufferWriter

  • newLine(): 写出一个换行符

代码示例:

@Test
public void copyByBufferStr(){
    try {
        //创建一个读入字符流
        FileReader reader=new FileReader(new File("D:\\\\test\\\\test.txt"));
        //创建一个输出字符流
        FileWriter writer=new FileWriter(new File("d:\\\\test\\\\test44.txt"));
        //定义增强流
        BufferedReader bufferedReader = new BufferedReader(reader);
        BufferedWriter bufferedWriter = new BufferedWriter(writer);
        //创建一个搬运工具
        char data[]=new char[20];
        //创建 长度
        int len=0;
        long start = System.currentTimeMillis();
        //从缓冲流中读取 表示从该输入读取最1024*8字节的数据流到字节数组data[]中
        while((len=bufferedReader.read(data))!=-1){
            bufferedWriter.write(data,0,len);//从指定字节数组data写入len字节从偏移off开始到此文件输出流,off=0,因为write里默认事append
        }
        long end = System.currentTimeMillis();
        System.out.println("复制文件耗时:"+(end-start));
        //关闭流的时候 ,后开的先关
        bufferedReader.close();
        bufferedWriter.close();
        reader.close();
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Test
public void readLine(){
    try {
        //创建一个读入字符流
        FileReader reader=new FileReader(new File("D:\\\\test\\\\test2.txt"));
        //创建一个输出字符流
        //定义增强流
        BufferedReader bufferedReader = new BufferedReader(reader);
        String str;
        while ((str=bufferedReader.readLine())!=null){
            System.out.println(str);
        }
        //关闭流的时候 ,后开的先关
        bufferedReader.close();
        reader.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

字节流和字符流的区别:

(1)每次读写的字节数不同;字符流是快读写,字节流是字节读写

(2)字符流带有缓存,字节流没有。

(3)字符流处理的单元为2个字节的Unicode字符,分别操作字符,字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。

字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符,可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。

后记:天道好轮回,苍天饶过谁~~,欠下的迟早是要还的~

以上是关于java文件复制-字符流的主要内容,如果未能解决你的问题,请参考以下文章

java文件复制-字符流

java文件复制-字符流

java文件复制-字符流

字符缓冲流复制java文件

java 21 - 4 字符流的文件复制操作以及简化

IO流 - 复制文件(字符流)