字节流和字符流的区别(一次弄懂)夏天·烟火·我的尸体

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

Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据。Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与OutputStream类均为抽象类,我们在实际使用中通常使用Java类库中提供的它们的一系列子类。下面我们以InputStream类为例,来介绍下Java中的字节流。

InputStream类中定义了一个基本的用于从字节流中读取字节的方法read,这个方法的定义如下:

publicabstractintread()throwsIOException;这是一个抽象方法,也就是说任何派生自InputStream的输入字节流类都需要实现这一方法,这一方法的功能是从字节流中读取一个字节,若到了末尾则返回-1,否则返回读入的字节。关于这个方法我们需要注意的是,它会一直阻塞知道返回一个读取到的字节或是-1。另外,字节流在默认情况下是不支持缓存的,这意味着每调用一次read方法都会请求操作系统来读取一个字节,这往往会伴随着一次磁盘IO,因此效率会比较低。有的小伙伴可能认为InputStream类中read的以字节数组为参数的重载方法,能够一次读入多个字节而不用频繁的进行磁盘IO。那么究竟是不是这样呢?我们来看一下这个方法的源码:

publicintread(byteb[])throwsIOException{returnread(b,0,b.length);}它调用了另一个版本的read重载方法,那我们就接着往下追:

Java中的字符流处理的最基本的单元是Unicode码元(大小2字节),它通常用来处理文本数据。所谓Unicode码元,也就是一个Unicode代码单元,范围是0x0000~0xFFFF。在以上范围内的每个数字都与一个字符相对应,Java中的String类型默认就把字符以Unicode规则编码而后存储在内存中。然而与存储在内存中不同,存储在磁盘上的数据通常有着各种各样的编码方式。使用不同的编码方式,相同的字符会有不同的二进制表示。实际上字符流是这样工作的:

我们通过一个demo来加深对这一过程的理解,示例代码如下:

以上代码中,我们使用FileWriter向demo.txt中写入了“demo”这四个字符,我们用十六进制编辑器WinHex查看下demo.txt的内容:

从上图可以看出,我们写入的“demo”被编码为了“64656D6F”,但是我们并没有在上面的代码中显式指定编码方式,实际上,在我们没有指定时使用的是操作系统的默认字符编码方式来对我们要写入的字符进行编码。

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

经过以上的描述,我们可以知道字节流与字符流之间主要的区别体现在以下几个方面:

THE END
1.字符流与字节流的区别在于()字符流与字节流的区别在于( ) A.前者带有缓冲,后者没有 B.前者是块读写,后者是字节读写 C.二者没有区别,可以互换使用 D.每次读写的字节数不同点击查看答案&解析进入小程序搜题你可能喜欢关于芳香疗法的注意事项,下列说法不正确的是( ) A. 不同个体对精油的敏感度相同 B. 根据患者的喜好选择精油 C. 纯...https://m.ppkao.com/wangke/daan/a448a039706648d5bec5280f01a4b069
2.2023年Java面试八股文(25w字)字节流如何转为字符流? 字符流与字节流的区别? BIO、NIO、AIO的区别? Java IO都有哪些设计模式? 二.集合 1. 常见的集合有哪些? 2. 线程安全的集合有哪些?线程不安全的呢? 3. Arraylist与 LinkedList 异同点? 4. ArrayList 与 Vector 区别? 5. 说一说ArrayList 的扩容机制? http://www.wjks.cn/news/3243.html
3.2.8W字Java基础学习和书籍推荐,真正意义上的从0到1学Java,才不是...数据范围与字节数不一定相关,例如 float 数据范围比 long 更加广泛,但是 float 是 4 字节,1ong 是 8 字节。 浮点型可能只是一个近似值,并非精确的值。 浮点数当中默认类型是 double。如果一定要使用 float 类型,需要加上一个后缀 F。 字符串不是基本类型,而是引用类型 ...https://xie.infoq.cn/article/544fc74928cf356576a3d0c58
4.字节流字符流及其转换比较与使用嘲在程序中所有的数据都是以流的方式进行传输和保存的。程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 在java.io包中操作文件内容的主要有两大类:字节流、字符流。两类都分为输入和输出操作。输入流基本方法是读,输出流基本方法是写。 https://www.jianshu.com/p/d6951279a947
5.Java程序设计期末考试题库(带答案).docxA、语法检查B、堆栈上/下溢检查C、字节编译D、内存跟踪答案:D145.字符流与字节流的区别在于()。A、每次读写的字节数不同B、前者是块读写,后者是字节读写C、前者带有缓冲,后者没有D、二者没有区别,可以互换使用答案:A146.分析选项中关于Java中this关键字的说法正确的是()。A、this关键字和类关联,而不是和...https://www.renrendoc.com/paper/231500487.html
1.详解Java中字符流与字节流的区别理解Java中字符流与字节流的区别 浏览:0 1. 什么是流Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列。和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流;能够向其写入一个字节序列的对象被称为输出流。 https://download.csdn.net/download/weixin_38700320/12798297
2.一个字符是几个字节字符与字节有什么区别?“字节流”与“字符流”有什么区别? 字节流和字符流的主要区别在于它们的处理方法。字节流是最基本的,采用ASCII编码。InputStream和OutputStream的所有子类都主要用于处理二进制数据,二进制数据是按字节处理的,而现实中很多数据是文本,并提出了字符流的概念,采用Unicode编码。它根据虚拟机的编码方式进行处理,即对字符集...http://www.zzfmdn.com/article/964593
3.Java期末简答题(论述题)以及几个编程题(常考)字节流字符流区别: 流: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 区别:字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的 字节流在操...https://cloud.tencent.com/developer/article/1779606
4.历尽数月,终于整理出一份让你涨薪8K的Java基础面试题解析十一、拷贝文件的工具类使用字节流还是字符流 答案:字节流 1. 什么是字节流,什么是字符流? 字节流:传递的是字节(二进制), 字符流:传递的是字符 2. 答案 我们并不支持下载的文件有没有包含字节流(图片、影像、音源),所以考虑到通用性,我们会用字节流。 https://maimai.cn/article/detail?fid=1401406558&efid=vJY_lZ-k7cqLTm0zfujhEg
5.JavaIO流(精讲)包含练习题及答案51CTO博客输入流: 只能从中读取数据,而不能向其写入数据。 输出流:只能向其写入数据,而不能向其读取数据。 按照操作单元划分,可以划分为字节流和字符流。 字节流和字符流的用法几乎完成全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。https://blog.51cto.com/laoshifu/4988605
6.JavaIO面试题及答案整理汇总1、字节流和字符流的区别? 答:读字节流时,读一个字节后返回一个字节;字节流使用字节流读取一个或多个字节(中文对应的字节数为两个,在 UTF-8 码表中是 3 字节)时间。首先检查指定的编码表,并返回找到的字符。字节流可以处理图片、MP3、AVI视频文件等各种类型的数据,而字符流只能处理字符数据。除了字节流,只要...https://www.tulingxueyuan.cn/tlzx/jsp/1437.html