NIO是JDK1.4之后出现的,针对于BIO(同步阻塞IO)的改进,属于同步非阻塞IO。
当然,在JDK1.7开始的NIO2(又称为AIO),在ava.nio.channels包下,又增加了几个异步操作的Channel类,所以,AIO属于异步非阻塞IO操作。会在后续文章中讨论。
Buffer
Buffer继承自Object类,是基本类型元素的线性有限序列(容器)。除内容外,Buffer的基本属性有:Capacity—容量,Limit—限制,Position—位置。对着三个变量操作,可以完成几乎所有对Buffer的代码操作。
- Capacity: 缓冲区的容量,即Buffer包含元素的数量。需要满足:capacity>=0 且 不能更改
- Limit:是第一个不应该读取或写入元素的索引。需要满足:limit>=0 且 limit<=capacity
比如,当前Buffer中有四个元素,那么第五个索引,即索引4,就是不应该读取或写入的索引值。 - Position:下一个要读取或写入的元素的索引。position>=0 且 position<=limit
比如,在4个元素的put操作之后,最后一个元素的索引为3,position会指向索引值4;flip()操作之后,索引重设,position指向0索引,始终指向下一个要读取或写入的元素的索引。
Buffer的子类
对于每个非 boolean 基本类型,此类都有一个子类与之对应。
包括:ByteBuffer, CharBuffer, DoubleBuffer, FloatBuffer, IntBuffer, LongBuffer, ShortBuffer
下面以IntBuffer为例,来使用一下Buffer操作的基本API:
public class Demo1IntBuffer {
/**
* 1.写入数据之前的position、limit和capacity: position = 0, limit = 10, capacity = 10
* 2.写入数据之后的position、limit和capacity: position = 4, limit = 10, capacity = 10
* 3.准备输出数据时的position、limit和capacity: position = 0, limit = 4, capacity = 10
* 缓冲区中的内容: 3,5,7,9,
*
* @param args
*/
public static void main(String[] args) {
IntBuffer buffer = IntBuffer.allocate(10);// 准备大小为10的缓冲区
System.out.println("1.写入数据之前的position、limit和capacity:");
System.out.println("position = " + buffer.position() + ", limit = " + buffer.limit() + ", capacity = "
+ buffer.capacity());
// 定义一个int数组
int[] temp = {
5, 7, 9 };
// 增加一个数据
buffer.put(3);
// 将temp也放入buffer中