JAVA--字符流和字节流

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

字节流就是万能流,为什么还提出字符流?字符流和字节流到底有什么区别


提示:以下是本篇文章正文内容,下面案例可供参考

一、字符流概念

(注:详细分析见:文件IO流
我们再梳理一下字符流产生原因:

  • 由于字节流操作中文不是特别的方便(有时候出现了乱码),所以Java就提供字符流

  • 字符流 = 字节流 + 编码表(底层也是字节流)

  • 中文的字节存储方式

  • 用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的> - 呢?

  • 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数(判断出是汉字之后,再根据编码方式进行两位或三位的连接)

  • 一个汉字存储(字节流,读到一个字节,返回一个字节):

  •     如果是GBK编码,占用2个字节
    
  •     如果是UTF-8编码,占用3个字节
    

二、字符流和字节流

我们都知道大多数情况下,字节是数据最小的基本单位,1 byte = 8 bit,而 1 char = 2 byte = 16 bit。
然后字节流是以字节为单位输入输出数据;字符流是以字符为单位输入输出数据。
Java 中的字节流处理基本单位为 1 个字节,通常用来处理二进制数据。
Java 中的字符流处理的最基本的单元是 Unicode 代码单元(大小2字节),通常用来处理文本数据。
字节流默认没有缓冲区,因此,读到一个字节,返回一个字节;字符流,默认有缓冲区,读到的字节后,先查指定的编码表,查到字符放到缓冲区,刷新后再显示。

1.区别

从概念我们可以了解到:
字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(纯文本的文件都是中文汉字,中文汉字对应的字节是两个或两个以上,这取决于不同的码表),先去查指定的编码表,将查到的字符返回。
其实,到这里还是对区别是模糊的,我们这样看:

字节流:
基本单位为一个字节,通常用来处理二进制数据
字节流在默认情况下是不支持缓存的,字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,也就是说每调用一次read方法都会请求操作系统来读取一个字节,这也就是说,每一次都有输入和输出(IO),因此效率会比较低。如果要使用内存缓冲区以提高读取的效率,我们需要使用BufferedInputStream。也就是,没有刷新或关闭流,数据不会到文件中。

字符流:
基本的单元是多个字节,常用来处理文本数据
Java中的String类型默认就把字符进行编码后存储在内存中。存储在磁盘上的数据通常有着各种各样的编码方式,不同的编码方式最终输出的字节内容是不同的,所以,字节流的读取和写入都要设置相应的编码方式。(不然会有编码异常)
由于字符流在输出前实际上是要根据读到字节,先去查指定的编码表,将查到的字符返回默认缓冲区,等待转换完毕,刷新或关闭时,一起写入文件,因为字符流默认支持缓存,因此用普通字符缓冲流操作和字符流操作的效率是差不多的,只有使用字符缓冲流的特有方法去操作(这里不做讲解,参考文件IO流学习)才能明显提高效率。


总结

java的IO流在处理上分为字符流和字节流。
实际上字节流的InputStream和OutputStream是所有操作的基础。字节流处理更为宽泛的。而对字节流做解码后就能得到字符流。所以,可以看做字符流是建立在字节流基础上,专门对文本文件处理的更加完善的一种处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值