本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
最近,我写的都是一些基础知识。一些人不屑于看,看了标题就私信我“能不能写点高级的,看了这标题我就知道内容了,在这样我就取关了!”
但是也有人表示喜欢看。“内容虽然基础,但是看完后我有了新的认知!”
所以,我的尴尬的取关数据是时候给大家展示一下了。
最近 30 天的趋势图如下所示。
我要感谢一部分网友通过转发、评论等形式对我的支持!谢谢你们!
好了,下面我们开始今天的内容。
字节流和字符流其实很好理解!
字节流就是 Byte 流,字节就是 Byte。
字符流就是 Character 流,字符就是 Character。
这里面有两个单位换算大家需要记住一下。
- 1 byte = 8 bit
- 1 char = 2 byte = 16 bit
虽然 1 bit 才是数据真正的最小单位,但 1 bit 的信息量太少了。要表示一个有用的信息,需要好几个 bit 一起表示。所以大多数情况下,字节是数据最小的基本单位。
比如,我们熟知的基本型的大小都是 8 bit(也就是1字节)的整数倍:
- boolean: 1 byte
- short: 2 byte
- int: 4 byte
- float: 4 byte
- long: 8 byte
- double: 8 byte
到这里,我们认识的都是字节。但是,Java I/O 的编码系统提供的 Java IO 库有两个支系,面向字节流的 InputStream 和 OutputStream;面向字符的 Reader 和 Writer。
为什么要有字符流呢?那是因为英文,我们可以用字节来表示,但是中文、日文、韩文等没法用字节来表示了,所有人们就想到了新的字符编码集。比如,Unicode 字符集,GB 18030,GBK,Big5,ISO-8859-1 等。
所以,最终就是一个字符用 1 个、2 个或 4 个字节组成。总而言之,一切都是字节流,其实没有字符流这个东西。字符只是根据编码集对字节流翻译之后的产物。
所以,字节流的 InputStream 和 OutputStream 才是一切的基础。实际总线中流动的只有字节流。需要对字节流做特殊解码才能得到字符流。Java 中负责从字节流向字符流解码的桥梁是InputStreamReader 和 InputStreamWriter。
看下面的 InputStreamReader 和 OutputStreamWriter 的结构图。
实际负责编码和解码的是 StreamDecoder 类和 StreamEncoder 类。编码过程中必须指定使用的字符编码集 Charset。所以 InputStreamReader 和 OutputStreamWriter 的构造器都带有 Charset 类型的参数。
如果没有指定编码集,将使用系统默认编码集。而我们经常使用的 FileInputReader 和 FileOutputWriter 就是 InputStreamReader 和 OutputStreamWriter 的派生类。
到现在,你是不是想起了那句话。“世界上本来没有路,走的人多了,也就变成了路。”
计算机中本没有字符流,一开始只适用于英文,但是互联网属于全人类的,所以人们又搞出了字符流。字符只是包装的字节而已。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 浅谈 Java 中的字节流与字符流