一、简介
1.1、按IO 类型分类结构图
1.2、Java IO 数据传输格式和方式
- 基于字节格式操作的 I/O 接口:InputStream 和 OutputStream
- 基于字符格式操作的 I/O 接口:Writer 和 Reader
- 基于磁盘方式操作的 I/O 接口:File
- 基于网络方式操作的 I/O 接口:Socket
二、Java IO 体系
2.1、字节流(Byte Streams )
基于字节的输入和输出操作接口分别是:InputStream 和 OutputStream 。
- InputStream 输入流的类继承层次图示
- 根据数据节点类型和处理方式划分图示
- 注意
- 在操作完 IO 流后,记得手动关闭流,避免严重的资源泄露
- 字节流时低等级的 IO 操作接口,在操作非二进制文件时,应避免使用字节流,而使用字符流代替
2.2、字符流(Character Streams)
基于字符的输入和输出操作接口分别是:Reader 和 Writer
字节流和字符流的区别
- 字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)
- 字节流用来处理二进制文件(图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,使用了某种编码,人可以阅读)。
- 不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符
Reader 输入流的类继承层次如下图所示:
- 根据数据节点类型和处理方式图示
2.3、字节流与字符流的转化
字节流与字符流的转化桥梁是 : InputStreamReader 和 OutputStreamWriter
- 输入流转化过程
- InputStream 字节输入流
- Charset 字符编码集
- Reader 字符输入流
- InputStreamReader 是字节到字符的转化桥梁
- StreamDecoder 解码器,是完成字节到字符过程的实现类
- 输出流转化过程
- OutputStream 字节输出流
- Charset 字符编码集
- Writer 字符输出流
- OutputStreamWriter 字符到字节的编码过程
- StreamEncoder 编码器,是完成字符到字节的编码过程的实现类
2.4、IO 磁盘操作的接口
- IO 文件交互图示
- IO 文件读取流程
- File: 在 Java I/O 体系中,File 类是唯一代表磁盘文件本身的对象
- FileDescriptor :真正代表一个存在的文件对象的描述
- 1、传入一个指定的文件名来创建 File 对象
- 2、通过 FileReader 来读取文件内容时,会自动创建一个FileInputStream对象来读取文件内容
- 3、可以通过FileInputStream对象调用getFD() 方法获取真正与底层操作系统关联的文件描述FileDescriptor
- 4、由于我们需要读取的是字符格式,所以需要 StreamDecoder 类将byte解码为char格式,于如何从磁盘驱动器上读取一段数据,由操作系统帮我们完成。
2.5、基于网络操作的 IO 接口
2.5.1、Socket简介
Socket 这个概念没有一个具体的实体,它是描述计算机之间完成相互通信一种抽象定义。
典型的基于 Socket 通信的应用程序场景,如下图:
2.5.2、使用 Socket 通讯流程
- 建立通信链路: tcp 三次握手,四次挥手
- 传输数据