Io流-小结

本文详细剖析了字节流与字符流在数据传输中的区别,解释了字节乱码现象,以及为何字符流能正确读取汉字。重点讲解了字符流如何通过编码表转换为单字节字符,并介绍了FileReader和FileWriter的便捷使用。还讨论了缓冲流的作用和字符流特有的行读取功能。

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

Io流-小结


一次读取一个字节

在这里插入图片描述从图看到,字节输入流将数据转换为字符时,乱码了,而字符则没有。
我是这样理解的

  • 字节流的基本单位是byte(字节),以字节形式转输。
  • 汉字是由不同编码表转换成不同字节组成的,一般最少两个字节,且第一个字节都是负数,当编码表识别到负数时,就会与后面的字节拼接。
  • 这里每遍历出一个字节就转换为char类型,所以转换汉字时就会乱码,它并没有与后面的字节拼接。

而字符流读取为什么可以读取到汉字呢?

  • 字符流=字节流+编码表;所以读取数据时,编码表先将汉字重新转换成相应字节后,我们再读取。
    在这里插入图片描述如图,编码集是GBK,我们看到中国原本的字节码是-42, -48, -71, -6
    当我们使用字符流读取时,编码表会将将汉字重新转换成相应字节后,如:“中”原本的字节是-42, -48,重新转换成了字节20013,这样汉字由两个字节就变成了一个字节,这样一次读取一个字节就读取到了汉字

也可以把重新转换的字节理解为字符,基本单位是字符,字符流以字符形式转输。

字符输入输出流的子类

  • FileReader:继承自InputStreamReader,用于读取字符文件的便捷类

      构造方法:FileReader(String fileName):String fileName == new FileInputStream(");
    
  • FileWriter:继承自OutputStreamWriter,用于写入字符文件的便捷类

      构造方法:Filewriter(String fileName):String fileName == new FileOutputStream(");
    

在这里插入图片描述
注:便捷类的好处就是减少了代码量,但是当涉及字符集的问题时,还是得依靠InputStreamReader类

一次读取一组字节

在这里插入图片描述如之前所说的理解,字符流以字符形式转输,所以只能以字符数组接收数据

缓冲流读一组数据

字节流和字符流都有一个缓冲区,作用大致一样
不带缓冲的操作,每读一个字节或者写入一个字节都要导致底层被调用,我们通过设置一个缓冲区,缓冲区都有默认大小,一般够我们使用。

当我们写数据时,数据较多时它会把这些数据放在缓冲区中,然后一次性写入目的地中(比如文件),这样就减小了底层的调用。

当我们读取数据时,它首先尝试在缓冲区中读取数据,若缓冲区里没有数据,那么缓冲区就会从数据源(比如文件)读取新数据,会尽可能的读取多的数据放入到缓冲区中。

在这里插入图片描述就如之前所说,字符流以字符形式传输,所以我们就可以不使用new String方法转换为字符,而字节则不行。
字符缓冲流有特有方法,读取一整行数据,返回值是String类型,不读取任何终止字符(\r\n),如果流的结尾已经到达,则为null,所以我们控制台输出的是"abcde中国!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值