Java 语言实现的 I/O 模型
1.概述
1.发展历史
-
JDK 1.4 之前,Java 所提供的网络编程API全部采用了I/O同步阻塞模型
-
JDK 1.4 引入了非阻塞I/O(NIO)类库,自此Java语言可以支持多路复用I/O模型
-
JDK 1.7 引入了异步I/O编程类库,被称为NIO2,也叫AIO
2.Java NIO 开源网络通信框架
-
Mina:Apache
-
Grizzly:
-
Netty:JBoss。事件驱动模型,线程模型。TCP/UDP,HTTP协议栈、SSL/TLS、STARTTLS,Applet、Android。
2.Java Classic I/O (Blocking I/O) 介绍
2.1 Streams 字节流 & Writer 与 Reader 字符流
java.io 包提供了对字节流、字符流进行输入/输出操作的多种包装类以适用多种应用场景:
-
字节流:8 bit,Java Stream
-
字符流:16 bit,字符集、字符编码
2.2 Java blocking I/O 网络通信实现
--客户端Socket的使用方式:
-
创建Socket对象,使用创建的Socket连接远程主机
-
建立连接后,从Socket得到输入流与输出流,Socket是全双工通道,可以使用这两个流与服务器之间相互发送数据
--服务端ServerSocket的使用方式:
-
绑定一个特定的端口创建ServerSocket对象
-
使用ServerSocket的accept()方法监听这个端口的请求连接,accept()会一直阻塞直到通过某个请求连接与客户端建立连接,此时accept()将返回客户端与服务端的连接的Socket对象
-
通过Socket对象的getInputStream()与getOutputStream()方法获得与客户端通信的输入流与输出流,进行通信交互
-
完成交互后关闭连接
3.Java Non-blocking I/O (NIO) 介绍
3.1 Buffer 缓冲区
-
在Classic I/O库中,数据直接面向Stream写入或者读取,而在NIO库中,数据读取与写入面向的是Buffer对象,这种差异使性能得到了巨大提高
-
缓冲区实质上是一个数组,java.nio库中提供了Buffer的抽象类
-
四个属性:0 <= 标记(Mark) <= 位置(Position)<= 上界(Limit)<= 容量(Capacity)
3.2 Channel 通道
-
Classic I/O中的Stream是单向的,通过OutputStream实现输出流,InputStream实现输入流。而NIO中的Channel是一个全双工通道,可以通过Channel实现同时读取与写入。如果说Buffer是运输沙子的卡车,Channel就是卡车行驶的道路。
-
文件读写通道、网络读写通道:
FileChannel:
DatagramChannel:通过UDP协议读写网络数据
SocketChannel:通过TCP/IP协议读写网络数据,客户端连接通道
ServerSocketChannel:SocketChannel对应的服务端通道实现,通过监听新的TCP/IP连接,对每一个新的连接创建新的SocketChannel
3.3 Selector 选择器
- Channel在Selector上注册,Selector通过不断轮询注册在其上的Channel,能够感知到Channel可读或者可写事件
3.4 Java I/O 复用网络通信实现
- NIO实现I/O复用模型整个编程模型较为复杂。在实际项目中,一般不会直接使用原生NIO的API构建网络通信程序,而是使用Mina、Netty、Grizzly其中之一来构建我们的网络通信服务。
4.NIO2 及 Asynchoronous I/O 介绍
-
NIO2主要改进了Classic I/O中java.io.File类对文件操作的局限性
-
NIO2还带来了真正意义上的Asynchronous I/O(异步I/O),具体实现分为文件Asynchronous I/O与网络传输Asynchronous I/O
4.1 NIO2 在 File 操作方面的升级
-
Path介绍:URI,FileSystems
-
Paths、Files工具类介绍
-
WatchService接口:提供了通过应用程序监听操作系统文件变更事件的能力
4.2 文件读写 Asynchronous I/O
- NIO2通过AsynchronousFileChannel提供了异步读写文件的功能。通过AsynchronousFileChannel异步读写文件有CompletionHandler与Future两种方式。
4.3 Java 异步 I/O 网络通信实现
- NIO2通过引入AsynchronousSocketChannel与AsynchronousServerSocketChannel实现了异步I/O网络通信模型。