Buffer
Java NIO中的Buffer用于NIO通道进行交互。
缓冲区本质上一块可以写入数据,也可以从中读取数据的内存。也就是堆外内存,也叫直接内存。
当向Buffer写入数据时,Buffer会记录下写了多少数据,一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到度模式。
在读模式下,可以读取之前写入到Buffer的所有数据。
一旦读完了所有数据,就需要情况缓存区,让它可以再次被写入。有两种方式能清空缓冲区,调用clear()或者compact()方法。
clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
任何未读的数据将被移到缓冲区的起始处,新写入的数据将放大缓冲区未读数据的后面。

Buffer的capacity,position和limit
capacity
capacity作为一个内存块,buffer有一个固定的大小值,也叫capacity,只能向内存中写入byte,long,char等类型。一旦Buffer满了,需要将其清空。
position
当写数据到Buffer中是,position表示当前的位置。初始的position值为0,当一个byte,long等数据写到buffer后,position会向前移动到下一个可插入数据的单元。positon最大可谓capacity-1.
当读取数据时,也是从特定位置读。将Buffer从写模式切换到读模式,positon会被重置0,当从Buffer的position处读取数据时,position向前移动到想一个可以读的位置。
limit
在写模式下,Buffer的limit表示你最多能往Buffer里写多少数据。写模式下,limit等于buffer的capacity
Buffer的分配
要想获得一个Buffer对象首先要进行分配。 每一个Buffer类都有一个allocate方法。下面是一个分配48字节capacity的ByteBuffer的例子。
源码
public abstract class Buffer { // Invariants: mark <= position <= limit <= capacity private int mark = -1;// 标记位置 private int position = 0;//当前位置 private int limit;// private int capacity;//容量
继承关系

public static void main(String[] args) {
// 创建指定长度的缓冲区
IntBuffer buffer= IntBuffer.allocate(10);
buffer.put(12);//向缓冲区存放数据
System.out.println(buffer);
buffer.put(13);
System.out.println(buffer);
buffer.put(15);
System.out.println(buffer);
buffer.flip();//复位 把position=0
System.out.println(buffer);
// 复位后读取读取数据
for (int j = 0; j <3 ; j++) {
System.out.println(buffer.get());
System.out.println(buffer);
}
}
java.nio.HeapIntBuffer[pos=1 lim=10 cap=10]
java.nio.HeapIntBuffer[pos=2 lim=10 cap=10]
java.nio.HeapIntBuffer[pos=3 lim=10 cap=10]
java.nio.HeapIntBuffer[pos=0 lim=3 cap=10]
12
java.nio.HeapIntBuffer[pos=1 lim=3 cap=10]
13
java.nio.HeapIntBuffer[pos=2 lim=3 cap=10]
15
java.nio.HeapIntBuffer[pos=3 lim=3 cap=10]
CharBuffer buffer=CharBuffer.allocate(10);
buffer.put("你好");
buffer.put("谢谢");
System.out.println(buffer.position());
buffer.put("不客气");
buffer.position(1).mark();//标记位置
while (buffer.hasRemaining()){
System.out.println(buffer.get());
buffer.reset();//复位到标记位置
}
System.out.println(buffer);
一直打印 好
缓存区是可以重复读取的,io中的流是不支持重复读取的
Java NIO Buffer详解
本文深入探讨了Java NIO中的Buffer概念,解释了其作为堆外内存的角色,以及如何通过写入、翻转和读取数据来操作Buffer。文章详细介绍了Buffer的capacity、position和limit属性,以及如何使用clear()和compact()方法清空缓冲区。

被折叠的 条评论
为什么被折叠?



