Java NIO系统的核心在于:通道(channel)和缓冲区(buffer)。通道表示打开到IO设备的连接。若需要使用NIO系统,需要获取用于连接IO设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,对数据进行处理。
Channel负责传输,Buffer负责存储。
缓冲区(Buffer):在Java NIO中负责数据的存储,缓冲区就是数组,用于存储不同数据类型的数据。根据数据类型不同,提供了相应类型的缓冲区(boolean除外)。所有缓冲区都是Buffer类型的子类
allocate()
获取缓冲区put()
存入数据到缓冲区get()
从缓冲区取出数据
缓冲区的四个核心属性:
- capacity:容量,表示缓冲区最大数据存储的容量,一旦声明不可改变(底层数组)
- limit:界限,表示缓冲区中可以操作数据的大小。limit外的数据不能进行读写
- position:位置,表示缓冲区中正在吃哦做数据的位置。0 <= mark <= position <= limit <= capacity
- mark:记录,表示记录当前position的位置,可以通过reset()方法恢复到mark的位置
@Test
public void bufferTest() {
ByteBuffer buffer = ByteBuffer.allocate(1024);
System.out.println("============allocate===============");
System.out.println("position:" + buffer.position()); //0
System.out.println("limit:" + buffer.limit()); //1024
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============put===============");
String str = "abcde";
buffer.put(str.getBytes());
System.out.println("position:" + buffer.position()); //5
System.out.println("limit:" + buffer.limit()); //1024
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============flip===============");
buffer.flip();
System.out.println("position:" + buffer.position()); //0
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============get===============");
byte dst[] = new byte[buffer.limit()];
buffer.get(dst);
System.out.println(new String(dst, 0, dst.length)); //abcde
System.out.println("position:" + buffer.position()); //5
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============rewind===============");
//可重复读
buffer.rewind();
System.out.println("position:" + buffer.position()); //0
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============clear===============");
//清空缓冲区,数据不清空
buffer.clear();
System.out.println("position:" + buffer.position()); //0
System.out.println("limit:" + buffer.limit()); //1024
System.out.println("capacity:" + buffer.capacity()); //1024
}
@Test
public void markTest() {
ByteBuffer buffer = ByteBuffer.allocate(1024);
String str = "abcde";
buffer.put(str.getBytes());
buffer.flip();
System.out.println("============get1===============");
byte dst1[] = new byte[buffer.limit()];
buffer.get(dst1, 0, 2);
System.out.println(new String(dst1, 0, dst1.length));
System.out.println("position:" + buffer.position()); //2
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
buffer.mark();
System.out.println("============get2===============");
byte dst2[] = new byte[buffer.limit()];
buffer.get(dst2, 0, 2);
System.out.println(new String(dst2, 0, dst2.length));
System.out.println("position:" + buffer.position()); //4
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
System.out.println("============reset===============");
buffer.reset();
System.out.println("position:" + buffer.position()); //2
System.out.println("limit:" + buffer.limit()); //5
System.out.println("capacity:" + buffer.capacity()); //1024
}