字符输入流Reader

因为我们再使用字节流读取文件的内容的时候,一次只能读取一个字节,但是如果内容是中文的话,可能会产生乱码的情况

如下所示:
已知a.txt文本文档中的内容为:你好啊

 public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:\\a.txt");
        int len = 0;
        while ((len = fis.read()) != -1){
            System.out.println((char)len);
        }
        fis.close();
    }

得到的结果为:
在这里插入图片描述

原因:
因为我们再读取的时候一个字节一个字节的读取,但是在编码UTF-8下一个字符占3个字节(utf-8编码下中文字符少数占4个字节,大多数中文字符占3个字节,gbk编码下常用中文字符占2个字节,该编码默认为两个字节的长度),原本一个汉字是三个字节,但是在第五行的时候我们仅仅对一个汉字的三分之一字节进行转换为char类型的话,就会出现乱码的情况

由此我们引入了字符流

java.io.Reader是字符串输入流,是字符串输入流中最顶层的父类,定义了一些共性的成员方法,同时他也是一个抽象类

Reader中的共性方法(不是全部)

  1. int read() 读取单个字符
  2. int read(char[] cbuf) 将字符读入数组
  3. abstract void close() 关闭该流并释放与之关联的所有资源。

由于字符流是一个抽象类,所以我们通过他的孙子类FileReader类来学习它

FileReader类是文件字符输入流

作用:把硬盘文件中的数据以字符的方式读取到内存当中

FileReader类中的构造方法

  1. FileReader(File file)在给定从中读取数据的 File 的情况下创建一个新 FileReader
  2. FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader

字符输入流的使用步骤:

1、创建FileReader对象,构造方法中绑定要读取的数据源
2、使用FileReader对象中的read方法读取文件的内容
3、释放资源

示范使用步骤(一):
已知a.txt文本文档中的内容为:你好啊

public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("d:\\a.txt");
        int len = 0;
        while ((len = fr.read()) != -1){
            System.out.println((char)len);
        }
        fr.close();
    }

得到的结果为:
在这里插入图片描述
示范使用步骤(二):

 public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("d:\\a.txt");
        char[] cs = new char[1024];
//        这里的len表示的是每次有效读取的个数
        int len = 0;
        while ((len = fr.read(cs)) != -1){
//            String(char[] value, int offset, int count)该构造方法的作用是将字符数组的一部分转换为字符串
//              offset表示数组开始的索引
//              count表示传唤的个数
            System.out.println(new String(cs, 0, len));
        }
        fr.close();
    }

运行的结果为:
在这里插入图片描述
由于使用的是int read(char[] cbuf)构造方法,所以导致的最后第一次输出就把你好啊都输出了,所以才没换行的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值