Java NIO

来源:互联网 发布:网站压力测试软件 编辑:程序博客网 时间:2024/06/06 12:24

概述

NIO有三大核心组件:Channel、Buffer、Selector。传统IO基于字节流和字符流进行操作,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作的。传统IO(BIO)是同步阻塞的,而NIO是同步非阻塞。AIO是异步非阻塞的。

同步和异步

同步和异步是针对应用程序和内核的交互而言的,
同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,
而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。异步是需要操作系统的支持。

阻塞和非阻塞

阻塞是在发起调用之后必须一致等待结果返回,期间不能做其他事情。
非阻塞是在发起调用之后会立即得到一个返回值(也许并没有执行完成)。

NIO的实现方式

Channel

这些是主要的Channel的实现类
* FileChannel :从文件读写
* DatagramChannel:从UDP读写
* SocketChannel:从TCP读写
* ServerSocketChannel:建立一个监听器,可以接受新的TCP连接

Buffer

本质上是一块可以写入数据,也可以读取数据的的内存,被包装为NIO的Buffer类。
一般对于Buffer的读写会分以下4步:
1. 写入数据到Buffer(int bytesRead = inChannel.read(buf);)
2. 调用flip()方法:将buffer切换为读模式
3. 从Buffer中读取数据
4. 调用clear()方法【清空buffer】或者compact()方法【将已经读取的清空,为读取的放在buffer的头部】

Selector

Select可以检测多个Channel是否为读写时间做好准备的组件。这样一个线程可以管理多个Channel,从而管理多个网络连接。
与Selector一起使用时,Channel必须处于非阻塞模式下。这意味着不能将FileChannel与Selector一起使用,因为FileChannel不能切换到非阻塞模式。而套接字通道都可以。

Scatter/Gather

Scatter:将一个Channel的数据放到多个Buffer中
Gather:将多个Buffer的数据写入一个Channel中

参考链接
http://ifeve.com/java-nio-vs-io/