Java网络编程—基于BIO、NIO、AIO的多人聊天室(一):IO类梳理
课程《一站式学习Java网络编程 全面理解BIO/NIO/AIO》的学习笔记(一):
IO类梳理 & 同步/异步/阻塞/非阻塞的概念
一、java.io梳理
网络编程的本质是进程间通信,而进程间通信的基础为IO模型。
java.io包中提供了大量与IO操作相关的类和方法,如下图所示,可大致分为字符流(处理单位为字符,可包含多个字节)和字节流(处理单位为字节)两类。下图所示Reader / Writer,InputStream / OutputStream均为接口,可被各种不同类实现,以完成不同的功能。
1.1 字符流
下图为字符流的几个主要实现类
- CharArrayReader / CharArrayWriter的数据源为字符数组,StringReader / StringWriter的数据源为字符串
- BufferdReader、FilterReader、InputStreamReader以及对应的Writer实现类为更高级的字符流实现类,它们采用装饰器模式,可在类创建时传入的另一个Reader / Writer的基础上提供更高级的额外功能。
- BufferedReader:额外提供一个缓冲区,可一次性从数据源中读取较多数据至缓冲区,减少对数据源的直接访问次数。缓冲区位于内存中,效率更高。
- FilterReader:抽象类,有很多子类,可在传入的Reader的基础上提供更多灵活的功能
-
InputStreamReader:将字节流转换为字符流,常用子类为FileReader(File中存储的数据为字节,FileReader可实现字节到字符的转换,从File中读取字符)
1.2 字节流
下图为字节流的几个主要实现类
- ByteArrayInputStream / ByteArrayOutputStream的数据源为字节数组,FileInputStream / FileOutputStream 的数据源为文件
-
FilterInputStream / FilterOutputStream为抽象类,可使用装饰器模式在传入的InputStream / OutStream 的基础上叠加更高级的功能,常见子类包括:。
- BufferedInputStream:额外提供缓冲区
- DataInputStream:从流中读取出指定的Java基本数据类型
-
DataOutputStream:将Java基本数据类型写到输出流中
二、同步/异步/阻塞/非阻塞
同步/异步 与 阻塞/非阻塞 可两两组合:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞
2.1 同步 & 异步
区别在于被调用方的行为(通信机制的区别):
- 同步:已知调用结果才将调用返回
- 异步:不需要等待调用结果即可返回
2.2 阻塞 & 非阻塞
区别在于调用方的行为(调用状态的区别):
- 阻塞:调用方在收到调用结果前,不能处理其他任何事务(注意是收到调用结果前,而不是调用返回前)
- 非阻塞:调用方在收到调用结果前,可处理其他事务