专栏首页业余草面试必问的 Java 字节流与字符流

面试必问的 Java 字节流与字符流

最近,我写的都是一些基础知识。一些人不屑于看,看了标题就私信我“能不能写点高级的,看了这标题我就知道内容了,再这样我就取关了!”

但是也有人表示喜欢看。“内容虽然基础,但是看完后我有了新的认知!”

所以,我的尴尬的取关数据是时候给大家展示一下了。

最近 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 的派生类。

到现在,你是不是想起了那句话。“世界上本来没有路,走的人多了,也就变成了路。”

计算机中本没有字符流,一开始只适用于英文,但是互联网属于全人类的,所以人们又搞出了字符流。字符只是包装的字节而已。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 米斯特白帽培训讲义(v2)漏洞篇 Web 中间件

    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是...

    ApacheCN_飞龙
  • 技术架构的选择决定公司的格局范围

    本文主要针对中小型互联网公司,特别适用于手机APP或者pc的后台架构,基本可以支撑5万日活。本文会对可能用到的相关技术进行技术选型的说明,以及技术的架构介绍。

    技术zhai
  • 聊聊flink的ParameterTool

    flink-core-1.7.1-sources.jar!/org/apache/flink/api/common/ExecutionConfig.java

    codecraft
  • leecode刷题(11)-- 反转字符串

    其实这道题我们很容易可以想到使用数组下标的方法,将字符串转换为 char 数组,遍历数组重新赋值。其中观察反转字符串可以知道,两个反转字符串字符的下标之和为字符...

    希希里之海
  • 微服务:Java EE的拯救者还是掘墓人?

    有人认为,微服务的大行其道是在给Java EE下达死刑判决书。也有人认为,Java EE已死的论调可笑至极。读者朋友,你们怎么看?

    技术zhai
  • 安卓逆向系列教程(三)静态分析工具

    几年之前,我们要破解 APK,可能需要用到 apktool、dex2jar、jd-gui 以及 smali2java 等工具。还需要在控制台中键入命令,但现在有...

    ApacheCN_飞龙
  • JAVA:一篇文章理清多态

    很多人总是喜欢,或者说错误地将JAVA中的多态理解得很复杂,最常见的错误说法就是所谓“方法的多态”,他们会给出类似下面的例子来佐证“多态是指方法的多态”:

    技术zhai
  • Struts2 学习之小白开始

      Struts2 概述:Struts2 是一个用来开发 MVC 应用程序的框架,他提供了 Web 应用程序开发过程中的一些常见问题的解决方案,比如对于用户输入...

    bgZyy
  • 【重磅】Spring Boot 2.0的蝴蝶效应

    就在本月的1号,Spring Boot 2.0.0.RELEASE正式发布,1号在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boo...

    技术zhai
  • 微服务:Java EE的拯救者还是掘墓人?

    有人说,Java确实过于臃肿,经常“小题大做”。但PHP、Node.js扩展方面短板太明显,做小应用可以,大型应用就玩不转了。 另外,Java EE领域有太多优...

    技术zhai

扫码关注云+社区

领取腾讯云代金券