NIO Buffer 基础知识

Java NIO Buffer详解
本文深入探讨了Java NIO中的Buffer概念,解释了其作为堆外内存的角色,以及如何通过写入、翻转和读取数据来操作Buffer。文章详细介绍了Buffer的capacity、position和limit属性,以及如何使用clear()和compact()方法清空缓冲区。

 

Buffer

Java NIO中的Buffer用于NIO通道进行交互。

缓冲区本质上一块可以写入数据,也可以从中读取数据的内存。也就是堆外内存,也叫直接内存。

当向Buffer写入数据时,Buffer会记录下写了多少数据,一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到度模式。

在读模式下,可以读取之前写入到Buffer的所有数据。

 

一旦读完了所有数据,就需要情况缓存区,让它可以再次被写入。有两种方式能清空缓冲区,调用clear()或者compact()方法。

clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。

任何未读的数据将被移到缓冲区的起始处,新写入的数据将放大缓冲区未读数据的后面。

 

 

 

Buffercapacitypositionlimit

capacity

capacity作为一个内存块,buffer有一个固定的大小值,也叫capacity,只能向内存中写入bytelongchar等类型。一旦Buffer满了,需要将其清空。

 

position

当写数据到Buffer中是,position表示当前的位置。初始的position值为0,当一个bytelong等数据写到buffer后,position会向前移动到下一个可插入数据的单元。positon最大可谓capacity-1.

当读取数据时,也是从特定位置读。将Buffer从写模式切换到读模式,positon会被重置0,当从Bufferposition处读取数据时,position向前移动到想一个可以读的位置。

 

limit

在写模式下,Bufferlimit表示你最多能往Buffer里写多少数据。写模式下,limit等于buffercapacity

 

Buffer的分配

要想获得一个Buffer对象首先要进行分配。 每一个Buffer类都有一个allocate方法。下面是一个分配48字节capacityByteBuffer的例子。

 

源码

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中的流是不支持重复读取的

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值