JAVA初级(三十一)I/O流基础(3),字符流FileReader和FileWriter

本文详细介绍了字符流和字节流的概念,包括FileReader和FileWriter的使用方法,以及它们之间的区别。通过实例展示了如何使用字符流读取和写入文本文件,并对比了字节流和字符流在处理不同文件类型时的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符流也是一种能读取和写入的流。只不过它专门处理字符,不处理字节

字符流有Writer和Reader两个抽象类。我们常用的字符流就是其下的FileWriter和FileReader来对文件内容进行读取和写入。

1,字符输入流FileReader读取文本文件
目录结构如下
在这里插入图片描述
首先创建一个FileReader对象并令其获取这个pro.txt的File对象

        File file = new File("F:/java/pro.txt");
        Reader reader = new FileReader(file);

这样一个FileReader就创建完成。接着使用相应方法来进行文件内容的读取。
read();//读取下一个字符,返回一个字符码值,如果没有内容即读到了末尾,返回-1
read(char[] char);//读取char.length位字符,并把值从char[0]开始存取。如果没有内容返回-1
read(char[] char,int off,int len);//从char[off]开始存取数据,从0开始读取,读len位。如果没有内容返回-1

        File file = new File("F:/java/pro.txt");
        Reader reader = new FileReader(file);
        //读取下一个位数,如果有字符返回该字符的编码,否则返回-1
        //reader.read();
        char[] chars = new char[10];
        //读取10位,把读取到的数据从chars[0]开始存取.len不能>chars.length-off
        reader.read(chars,0,10);
        int len = 0;
        //读取chars.length位长度,并将对应的字符编码数据存到chars中,返回读取到的实际位数.
        while ((len=reader.read(chars))!=-1){
           System.out.println(new String(chars,0,len));
        }

运行结果如下:
在这里插入图片描述
会发现同样在读取"UTF-8"格式的文档时第一行开头多出个符号或乱码。这个应该是个BUG,只能说根据具体情况具体处理了。或者有能力的话可以自己去修复这个JAVABUG。。

2,字符输出流FileWriter写文本文件

目录如下,目标就是用字符输入流把内容写到pro里面
在这里插入图片描述
首先创建一个FileWriter对象并令其获取pro的File对象

        File file = new File("F:/java/pro.txt");
        Writer writer = new FileWriter(file);

这样就可以往pro里面编辑了。
write(String str);//写入一串字符串,参数是String
write(char[] c);//写入一串字符,用char[]数组
write(String str,inf off,int len);//写入一串字符串,从String字符串第off位开始取数据并写入到文本中,写len长度,len不能>str.length()-off
write((char[] c,inf off,int len);//写入一串字符,用char数组,从char[off]位开始拿数据并写入到文本中,写len长度,len不能>char.length-off
flush();//刷新缓冲区,字符流会使用缓冲区。需要调用此方法才能把数据真正的写入到文本中。也可以直接调用close();方法,这个方法包含了flush()的功能

        File file = new File("F:/java/pro.txt");
        Writer writer = new FileWriter(file);
        //往pro.txt写入"你好啊"
        writer.write("你好啊");
        //往pro.txt写入"好啊"
        writer.write("你好啊",1,2);
        //字符流会使用缓冲区.需要刷新缓存才能把写入的数据填写到文本中
        writer.flush();
        //当然可以直接调用close(),close()里面包含了刷新缓存功能
        writer.close();

运行结果如下:
在这里插入图片描述
字符流会使用缓冲流,需要调用flush()方法才会把数据写到文本中。也可以直接调用close()方法。close()方法包含了flush()的功能
在这里插入图片描述

3,字节流和字符流的区别
(1)代码上的区别。
字节流使用OutputStream和InputStream。且读取和写入的是byte
字符流使用Writer和Reader。读取和写入的是字符即String,char
(2)字符流会使用缓冲。字节流默认不会使用缓冲
(3)数据处理的区别。字节流能处理任何文件。字符流只能处理文本。
首先文本文件不用说都能处理。下面来让两种流分别读取一张图片看看效果会如何
看下图,这是一张图片。

在这里插入图片描述
分别用字节流和字符流读取看看结果。
在这里插入图片描述
字符流是一堆乱码,字节流则是编码。原因是图片里面保存的是二进制数据,而字节流操作的是字节就是二进制数据,字符流操作的是Unicode码元。每个字母,都有对应的编码元存在。字符流能方便的直接操作这些编码。但字节流不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值