一、简介

1.1、按IO 类型分类结构图image.png

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 输入流的类继承层次图示

image.png

  • 根据数据节点类型和处理方式划分图示

image.png

  • 注意
    • 在操作完 IO 流后,记得手动关闭流,避免严重的资源泄露
    • 字节流时低等级的 IO 操作接口,在操作非二进制文件时,应避免使用字节流,而使用字符流代替

2.2、字符流(Character Streams)

基于字符的输入和输出操作接口分别是:Reader 和 Writer

  • 字节流和字符流的区别

    • 字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)
    • 字节流用来处理二进制文件(图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,使用了某种编码,人可以阅读)。
    • 不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符
  • Reader 输入流的类继承层次如下图所示:

image.png

  • 根据数据节点类型和处理方式图示

image.png

2.3、字节流与字符流的转化

字节流与字符流的转化桥梁是 : InputStreamReader 和 OutputStreamWriter

  • 输入流转化过程

image.png

  • InputStream 字节输入流
  • Charset 字符编码集
  • Reader 字符输入流
  • InputStreamReader 是字节到字符的转化桥梁
  • StreamDecoder 解码器,是完成字节到字符过程的实现类
  • 输出流转化过程

image.png

  • OutputStream 字节输出流
  • Charset 字符编码集
  • Writer 字符输出流
  • OutputStreamWriter 字符到字节的编码过程
  • StreamEncoder 编码器,是完成字符到字节的编码过程的实现类

2.4、IO 磁盘操作的接口

  • IO 文件交互图示

image.png

  • IO 文件读取流程

image.png

  • 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 通信的应用程序场景,如下图:
image.png

2.5.2、使用 Socket 通讯流程

  • 建立通信链路: tcp 三次握手,四次挥手
  • 传输数据

参考