Java网络编程—基于BIO、NIO、AIO的多人聊天室(一):IO类梳理

课程《一站式学习Java网络编程 全面理解BIO/NIO/AIO》的学习笔记(一):
IO类梳理 & 同步/异步/阻塞/非阻塞的概念

一、java.io梳理

网络编程的本质是进程间通信,而进程间通信的基础为IO模型

java.io包中提供了大量与IO操作相关的类和方法,如下图所示,可大致分为字符流(处理单位为字符,可包含多个字节)和字节流(处理单位为字节)两类。下图所示Reader / Writer,InputStream / OutputStream均为接口,可被各种不同类实现,以完成不同的功能。
Java网络编程—基于BIO、NIO、AIO的多人聊天室(一):IO类梳理

1.1 字符流

下图为字符流的几个主要实现类

  • CharArrayReader / CharArrayWriter的数据源为字符数组,StringReader / StringWriter的数据源为字符串
  • BufferdReader、FilterReader、InputStreamReader以及对应的Writer实现类为更高级的字符流实现类,它们采用装饰器模式,可在类创建时传入的另一个Reader / Writer的基础上提供更高级的额外功能。
    • BufferedReader:额外提供一个缓冲区,可一次性从数据源中读取较多数据至缓冲区,减少对数据源的直接访问次数。缓冲区位于内存中,效率更高。
    • FilterReader:抽象类,有很多子类,可在传入的Reader的基础上提供更多灵活的功能
    • InputStreamReader:将字节流转换为字符流,常用子类为FileReader(File中存储的数据为字节,FileReader可实现字节到字符的转换,从File中读取字符)
      Java网络编程—基于BIO、NIO、AIO的多人聊天室(一):IO类梳理

1.2 字节流

下图为字节流的几个主要实现类

  • ByteArrayInputStream / ByteArrayOutputStream的数据源为字节数组,FileInputStream / FileOutputStream 的数据源为文件
  • FilterInputStream / FilterOutputStream为抽象类,可使用装饰器模式在传入的InputStream / OutStream 的基础上叠加更高级的功能,常见子类包括:。
    • BufferedInputStream:额外提供缓冲区
    • DataInputStream:从流中读取出指定的Java基本数据类型
    • DataOutputStream:将Java基本数据类型写到输出流中
      Java网络编程—基于BIO、NIO、AIO的多人聊天室(一):IO类梳理

二、同步/异步/阻塞/非阻塞

同步/异步 与 阻塞/非阻塞 可两两组合:同步阻塞同步非阻塞异步阻塞异步非阻塞

2.1 同步 & 异步

区别在于被调用方的行为(通信机制的区别):

  • 同步:已知调用结果才将调用返回
  • 异步:不需要等待调用结果即可返回

2.2 阻塞 & 非阻塞

区别在于调用方的行为(调用状态的区别):

  • 阻塞:调用方在收到调用结果前,不能处理其他任何事务(注意是收到调用结果前,而不是调用返回前)
  • 非阻塞:调用方在收到调用结果前,可处理其他事务