Java IO——字节流和字符流详解&区别对比

Java IO——字节流和字符流详解&区别对比本文将详细介绍字节流和字符流 剖析它们之间的本质区别 以及区别和对比

Java IO——字节流和字符流详解&区别对比


概述

大多数应用程序都需要实现与设备之间的数据传输,在Java中,将这种通过不同输入输出设备(例如:输入设备、内存、显示器、网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。 IO流,即InputOutput的缩写。

Java IO库有两个支系:

  1. 面向字节流的InputStream和OutputStream
  2. 面向字符的Reader和Writer

java流在处理上分为字符流和字节流。实际上字节流的InputStream和OutputStream是一切的基础。实际总线中流动的只有字节流。需要对字节流做特殊解码才能得到字符流。Java中负责从字节流向字符流解码的桥梁是:InputStreamReader和InputStreamWriter。

字节流&字符流

大多数情况下,字节是数据最小的基本单位,1 byte = 8 bit,而 1 char = 2 byte = 16 bit。

在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。

Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流;能够向其写入一个字节序列的对象被称为输出流。

输入流是相对程序而言的,外部传入数据给程序需要借助输入流,而程序把数据传输到外部需要借助输出流。

字节流

Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了最基本的输入字节流和输出字节流。InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先,它们都是抽象类。

字节流在默认情况下是不支持缓存的,字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,这意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。要使用内存缓冲区以提高读取的效率,我们应该使用BufferedInputStream。

需注意,使用BufferedOutputStream输出数据时如果没有关闭流,数据也是不会输出到文件当中的,即并不是所有字节流都不用到缓冲区,输入缓冲字节流BufferedInputStream和输出缓冲字节流BufferedOutputStream还是要用到缓冲区的。

字符流

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据,例如字符、字符数组或字符串。Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。存储在磁盘上的数据通常有着各种各样的编码方式,不同的编码方式最终输出的字节内容是不同的,所以,字节流的读取和写入都要设置相应的编码方式。

由于字符流在输出前实际上是要完成Unicode码元序列到相应编码方式的字节序列的转换,所以它会使用内存缓冲区来存放转换后得到的字节序列,等待都转换完毕再一同写入磁盘文件中。

所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

字节流和字符流的区别

字节流和字符流的转换

字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的,但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化,这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。在从字节流转化为字符流时,实际上就是byte[]转化为String时,而在字符流转化为字节流时,实际上是String转化为byte[]时。

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。

字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。

字节流与字符流主要的区别是他们的的处理方式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217884.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:33
下一篇 2026年3月18日 上午8:33


相关推荐

  • Python 字母大小写的转换

    Python 字母大小写的转换1name="AdaLovelace"2print(name.upper())3print(name.lower())

    2022年7月6日
    24
  • Pycharm的汉化教程

    Pycharm的汉化教程首先 下载 pycharm 的汉化包下载地址 链接 https pan baidu com s 1xtw6gYD SQElg7s2hSoV 提取码 0nn1 然后我们找到 pycharm 的安装目录下的 lib 目录 把我们下载好的文件复制进去就可以了 然后我们重启 Pycharm 就变成了中文的了

    2026年3月27日
    2
  • Mac苹果电脑30分钟安装OpenClaw+DeepSeek+飞书插件全程指南 (2026版)

    Mac苹果电脑30分钟安装OpenClaw+DeepSeek+飞书插件全程指南 (2026版)

    2026年3月13日
    2
  • 文章序号使用顺序

    文章序号使用顺序文章中正确使用序号的顺序如下 第一层为 一 二 三 第二层为 一 二 三 第三层为 1 2 3 第四层为 1 2 3 第五层为 扩展资料 1 阿拉伯数字后面用黑圆点 2 汉字数字后面用顿号 3 第一 第二 第三 后面用逗号 4 带括号的序号和带圆圈的序号 后面不再加顿号 逗号之类 5 第一编 第一章 第一节 或 壹 的后面不用标点 与后面的文字之间空一个汉字位置即可

    2026年1月26日
    2
  • mqttnet 详解_mqttnet 简记

    mqttnet 详解_mqttnet 简记1.mqttnet开源库,https://github.com/chkr1011/MQTTnet2.服务器端和客户端服务器端和客户端两个,他们需要保持长连接,主要是通过订阅和发布来进行消息的传递交换。MQTT服务端主要用于与多个客户端保持连接,并处理客户端的发布和订阅等逻辑。一般很少直接从服务端发送消息给客户端(可以使用mqttServer.Publish(appMsg);直接发送消息),多…

    2022年6月25日
    105
  • idea2021激活码永久破解【永久激活】

    (idea2021激活码永久破解)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~MLZP…

    2022年3月21日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号