一、流
流:数据的有序集合,能从一端传输到另一端的过程流
本质:数据传输
在Java API中,可以从其中读入一个字节序列的对象称作输入流,可以向其中写入一个字节序列的对象叫输出流。这些字节序列的来源地和目的地可以是文件,也可以是网络,或者磁盘,抽象类InputStream和OutputStream构成了输入/输出(I/O)层次结构的基础;
因为面向字节的流不便于处理以Unicode形式存储的信息(因为其中每个字符都使用了多字节来表示),所以抽象类Reader和Writer中继承出来一个专门用来处理Unicode字符的单独的类层次结构,这些类拥有的写入和写出操作都是基于两字节的Unicode码元的,而不是基于单字节的字符;
二、分类
1. 4种IO流的基类
字节输入流:InputStream
字节输出流:OutputStream
字符输入流:Reader
字符输出流:Writer
2. 流的划分
-
按照方向划分:
- 输入流:将数据从介质(磁盘、网络)到当前程序的传输
- 输入流是以InputStream和Reader为基类
- 输出流:将数据从程序写入到存储介质中
- 输出流是以OutputStream和Writer为基类
- 输入流:将数据从介质(磁盘、网络)到当前程序的传输
-
按照操作单元划分
- 字节流:二进制表示的数据,一个字节8bit位
- 字节流是以InputStream和OutputStream为基类
- 字符流:将数据以字符形式表示
- 字符流是以Reader和Writer作为基类
- 字节流:二进制表示的数据,一个字节8bit位
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
- 按照角色划分
- 节点流(介质流) : 数据从 / 向一个介质(磁盘、鼠标、屏幕)读 / 写的流,也称之为低级流
- 处理流(过滤流) : 和节点流直接相连接的流
3. 字节和字符的区别
字节:存储的数据是二进制数
字符:存储的是字符
-
读写的单元不同:
- 字节流是以字节8bit为单位
- 字符流是以字符为单位,根据码表映射字符,一次可以读取多个字节
-
处理的对象不同
- 字节流可以处理所有类型的数据(图片,视频)
- 字符流只能处理字符类型的数据
-
处理效率
- 字节流效率较高,直接进行读取
- 字符流效率较低,涉及到编解码
-
可移植性
- 字节流的可移植性高,和平台无关
- 字符流需考虑编解码过程,编解码需保持一致
4. 节点流和处理流的区别
节点流直接和介质相连接;
介质流直接和节点流相连接;
5. 编解码与常见码表
计算机底层数据存储都是二进制进行存储
- 码表:将字符和数字建立起映射关系,字节和字符的相互转换
- 编码过程:字符—> 字节
- 解码过程:字节–>字符
常见码表:
ASCII码:一个字节中的7位表示,对应字节都是整数 0-xxxxxxx
ISO-8899-1 拉丁码表 :用一个字节中的8位表示,可以表示整数和负数
GBK中文码表 :用两个字节表示,2个字节中,第一个字节高位为1,第二个字节高位为0
Unicode国际标准码表:无论什么文字都是两个字节
UTF-8 基于Unicode,一个字节表示存储信息,每一个字节头加入了编码信息