Java IO
2024-09-02 11:37:28
# 技术
JavaNIO
概述
三种IO模型
Java支持三种I/O
模式
BIO
NIO
AIO
BIO (Blocking):
JDK1.4以前的同步阻塞IO,当客户端有连接请求时,服务器就需要启动一个线程进行处理。
NIO (Non-blocking)
JDK1.4以后,同步非阻塞IO,服务端使用一个线程处理多个请求,客户端发送的连接请求会注册到多路复用器上,多路复用器轮询到连接有
I/O
请求就处理
AIO (Asynchronous)
JDK1.7以后,异步非阻塞IO。它的特点是先由操作系统完成后才通知服务端程序启动线程去处理。
三种IO模型的适用场景
BIO
方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,程序简单易理解。NIO
方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等,编程比较复杂。AIO
方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS
参与并发操作,编程比较复杂。
NIO
和BIO
的比较
BIO
以流的方式处理数据,而NIO
以块的方式处理数据,块I/O
的效率比流I/O
高很多。BIO
是阻塞的,NIO
则是非阻塞的。BIO
基于字节流和字符流进行操作,而NIO
基于Channel
(通道)和Buffer
(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector
(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道。
NIO原理
NIO三大核心
NIO
有三大核心部分: Channel
(通道)、Buffer
(缓冲区)、Selector
(选择器) 。
NIO三大核心关系图
- 每个
Channel
都会对应一个Buffer
。 Selector
对应一个线程,一个线程对应多个Channel
(连接)。- 该图反应了有三个
Channel
注册到该Selector
//程序 - 程序切换到哪个
Channel
是由事件决定的,Event
就是一个重要的概念。 Selector
会根据不同的事件,在各个通道上切换。Buffer
就是一个内存块,底层是有一个数组。Buffer
可以通过flip
方法切换读写模式。
缓冲区(Buffer)
缓冲区(Buffer
):缓冲区本质上是一个可以读写数据的内存块,可以理解成是一个容器对象(含数组),该对象提供了一组方法,可以更轻松地使用内存块,,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况。Channel
提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer
Buffer类及其子类
通道(Channel)
NIO
的通道类似于流,但有些区别如下:- 通道可以同时进行读写,而流只能读或者只能写
- 通道可以实现异步读写数据
- 通道可以从缓冲读数据,也可以写数据到缓冲:
BIO
中的Stream
是单向的,例如FileInputStream
对象只能进行读取数据的操作,而NIO
中的通道(Channel
)是双向的,可以读操作,也可以写操作。Channel
在NIO
中是一个接口public interface Channel extends Closeable{}
- 常用的
Channel
类有:FileChannel
、DatagramChannel
、ServerSocketChannel
和SocketChannel
。ServerSocketChanne
类似ServerSocket
、SocketChannel
类似Socket
FileChannel
用于文件的数据读写,DatagramChannel
用于UDP
的数据读写,ServerSocketChannel
和SocketChannel
用于TCP
的数据读写。h