什么是NIO ?
jdk 1.4之后,Java中新增了 java.nio包,Java NIO提供了与标准IO API不同的IO工作方式。
NIO 的几个概念
缓冲区 Buffer
缓冲区是一个容器,存放特定原始类型(char、byte、int、long、float等)的固定大小的数据。缓冲区具有内容、位置、限制和容量。
通道 Channel
Channel 是一个通道,网络数据通过Channel 读取和写入, 通道与流不同之处是在于通道是双向的,流只能是 读或者写,而通道可以读、写 或者二者同时进行。
多路复用器 Selector
多路复用器 提供选择已经就绪的任务的能力,Selector 会不断地轮询注册在其上的Channel ,如果某个Channel 上面发生读或者写事件,这个Channel 就处于就绪状态,会被Selector 轮询出来。
字符集 Charset
用于在字节和unicode之间进行转换的字符集、解码器和编码器
IO 与 NIO 的区别
IO | NIO |
---|---|
面向流 | 面向缓冲 |
阻塞IO | 非阻塞IO |
面向流 VS 面向缓冲
面向流的Java IO意味着每次从流读取一个或多个字节。它们不会被缓存到任何地方。
Java NIO的面向缓冲区的方法略有不同。数据被读入缓冲区,然后从缓冲区处理数据。可以根据需要在缓冲区中来回移动。这在处理过程中具有更大的灵活性。
阻塞IO VS 非阻塞IO
阻塞IO,当线程调用read()或write()时,该线程将被阻塞,直到数据被读取,或者数据被完全写入。线程在此期间不能做其他任何事情。
Java NIO的非阻塞模式允许线程请求从通道读取数据,并且只获取当前可用的数据,或者如果当前没有数据可用,则什么也得不到。线程可以继续执行其他操作,而不是一直阻塞,直到数据可供读取为止。
非阻塞IO写入也是这样。线程可以请求将一些数据写入通道,但不用等待它完全写入。线程可以继续执行其他操作。
参考资料
1.Netty权威指南(第2版)
2.Java NIO vs. IO
3.Java NIO Programming Cookbook