Java IO
2024-09-02 11:37:28
# 技术
JavaNIO
概述
三种IO模型
Java支持三种I/O模式
BIONIOAIO
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

