字符流(Reader和Writer),字符流操作文件,字符流的缓冲区

字符流
  • 抽象类Reader和Writer时是字符流的顶级父类
  • Reader是字符输入流,用于从某个源设备读取字符
  • Writer是字符输出流,用于从某个原设备写入字符

注意:Reader和Writer是抽象类,不能被实例化

Reader和Writer提供不同的子类,这些子类的体系结构图如下:

在这里插入图片描述

FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,提高读写效率

字符流操作文件
  • 字符输入流FileReader,从文件中读取一个或多个字符

当前目录下新建文本文件"reader.txt",并输入字符"好好学习,天天向上!",创建一个使用字符输入流FileReader读取文件中字符的类,如下代码:

package com.Put;


import java.io.FileReader;

public class IO {
    public static void main(String[] args) throws Exception{

        //创建FileReader对象,并指定要读取的文件
        FileReader fileReader = new FileReader("reader.txt");
        //定义一个int类型的变量len,其初始值为0
        int len = 0;
        //循环来判断是否读取到文件的末尾
        while ((len=fileReader.read())!=-1){
            System.out.print((char) len);
        }
        //关闭流
        fileReader.close();

    }
}

运行结果:

好好学习,天天向上!

简述:

由于字符流的read()方法返回的是int类型的值,如果想要获取字符就需要进行强制类型转换,输出语句将变量len强转为了char类型

  • 字符输出流FileWriter,向文件中写入字符

代码如下:

package com.Put;
import java.io.FileWriter;

public class IO {
    public static void main(String[] args) throws Exception{

        //创建字符输出流,并指定文件
        FileWriter fileWriter = new FileWriter("writer.txt");
        //将定义的字符写入文件
        fileWriter.write("轻轻的我走了,\r\n");
        fileWriter.write("正如我轻轻的来了,\r\n");
        fileWriter.write("我轻轻的招手,\r\n");
        fileWriter.write("作别西天的云彩,\r\n");
        //关闭流
        fileWriter.close();
    }
}

程序结束生成一个"writr.txt"的文件,如图:

在这里插入图片描述

FileWriter和FileOutputStream一样,如果文件不存在,创建新的文件,如果存在,首先会清空文件的内容;如果向追加数据,同样需要调用重载的构造方法

FileWriter fileWriter = new FileWriter("writer.txt",true);
字符流的缓冲区

字符流的缓冲区实现文件的拷贝

直接上代码:

package com.Put;
import java.io.FileReader;
import java.io.FileWriter;

public class IO {
    public static void main(String[] args) throws Exception{

        //创建FileReader对象,并指定要读取的文件
        FileReader fileReader = new FileReader("reader.txt");
        //创建FileWriter对象,并指定写入数据的目标文件
        FileWriter fileWriter = new FileWriter("writer.txt",true);
        //定义一个int类型的变量len,其初始值为0
        int len = 0;
        //定义一个长度为1024的字符数组
        char[] buff = new char[1024];
        //循环来判断是否读取到文件的末尾
        while ((len=fileReader.read(buff))!=-1){
            //输出读取到的字符
            fileWriter.write(buff,0,len);
        }
        //关闭流
        fileReader.close();
        fileWriter.close();

    }
}

运行效果(参数append为true,追加):

在这里插入图片描述

简述:

具体的创建与字节流缓冲区实现文件的拷贝类似,只是创建的缓冲区不一样,这里使用了new char[1024]创建一个字符缓冲区

字符缓冲流
  • 字符流也提供了带缓冲区的字符缓冲流,分别是BufferedReader和BufferedWriter
  • BufferedReader用于对字符输入流进行操作,BufferedWriter用于对字符输出流进行操作
  • BufferedReader有一个重要的方法readLine()用于一次读取一行文本
package com.Put;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;

public class IO {
    public static void main(String[] args) throws Exception{

        //创建一个字符输入缓冲流对象
        BufferedReader br = new BufferedReader(new FileReader("reader.txt"));
        //创建一个字符输出缓冲流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("writer.txt"));
        //声明一个字符串变量str
        String str = null;
        //循环时每次读取一行文本,如果不为空(即到了文件的末尾),则继续循环
        while ((str=br.readLine())!=null){
            //通过缓冲流对象写入文件
            bw.write(str);
            //写入一个换行符,该方法会根据不同的操作系统生成相应的换行符
            bw.newLine();
        }
        //关闭流
        br.close();
        bw.close();

    }
}

简述:在拷贝过程中,每次循环都使用readLine()方法读取文件的一行,然后通过write()方法写入目标文件,同时使用了newLine()进行换行写入,否则读取源文件所有行内容都会追加写入目标文件的一行中。其中readLine()方法会逐个读取字符,当读到回车符"\r"或者换行符"\n"时会将读到的字符作为一行内容返回。

注意:字符缓冲流也使用了缓冲区,在调用BufferedWriter的write()方法写入字符时,这些字符首先会被写到缓冲区,当缓冲区写满时或调用close()方法时,缓冲区中的字符才会被写到目标文件。因此在循环结束时一定调用close()方法,否则会导致部分在缓冲区的内容没有被写道目标文件

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等慢慢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值