Java.nio.Buffer

Java.nio.Buffer 是用于特定的基本类型数据(每个非 boolean 基本类型都存在此类的一个子类)的容器(缓冲区),缓冲区是特定的基本类型元素的线性、有限序列。

缓冲区的基本属性除其内容外还包括容量、限制和位置:
缓冲区的容量 capacity() 是它所包含的元素的数量。缓冲区的容量永远不会为负并且从不会更改;
缓冲区的限制 limit() 是不应读取或写入的第一个元素的索引。缓冲区的限制永远不会为负,并且永远不会大于其容量;
缓冲区的位置 position(int newPosition) 是下一个要读取或写入的元素的索引。缓冲区的位置永远不会为负,并且永远不会大于其限制。

在初始状态下,缓冲区的limit和capacity值相同。但limit和capacity的区别是limit可以通过limit方法进行设置,而capacity在创建缓冲区时就已经指定了,并且不能改变。

java.nio.Buffer 的 position, limit, Capacity

如果position的值等于limit,就不能访问缓冲区的当前数据,也就是说不能使用get和put方法。否则将抛出 BufferOverflowException异常。由于使用allocate创建的缓冲区并不是一次性地分配内存空间,因此,可以将缓冲区的 capacity设为很大的值,如10M。缓冲区过大可能在某些环境中会使系统性能降低(如在PDA或智能插秧机中),因此,可以使用limit方法根据具体的情况来限定缓冲区的大小。当然,limit还可以表示缓冲区中实际的数据量。

nio.Buffer的3个方法:清除、反转和重绕

clear() 使缓冲区做好了新序列信道读取或相对 put 操作的准备:它将限制设置为容量大小,将位置设置为零。 flip() 使缓冲区做好了新序列信道读取或相对 get 操作的准备:它将限制设置为当前位置,然后将该位置设置为零。 rewind() 使缓冲区做好了重新读取已包含的数据的准备:它使限制保持不变,并将位置设置为零。

下面用几个例子展示nio.Buffer

import java.nio.IntBuffer;

public class InetBuferTest2 {

public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(8);
for(int i = 1 ; i <= 8 ; i++){
buf.put(i);
}
System.out.println(buf.position()+ " " + buf.limit());

//重新设置position
/*buf.position(1);
buf.limit(5);
for(int i = 1; i < 5 ; i++){
//int temp = buf.get();
buf.put(10+3);
}
System.out.println(buf.get(1));

buf.flip();
while(buf.hasRemaining()){
System.out.print(buf.get()+" ");
}*/

//设置子缓冲区
buf.position(2);
buf.limit(6);

IntBuffer sbuf = buf.slice();//设置子缓冲区
while(buf.hasRemaining()){
System.out.println(buf.get());
sbuf.put(10);
}
System.out.println(buf.position() + " " + buf.limit());

buf.flip();//position = 0 但是limit是上次的position 值为2 如果你想全部遍历那么需要把limit设置为最大容量的值
buf.limit(buf.capacity());
System.out.println(buf.position() + " " + buf.limit());
while(buf.hasRemaining()){
System.out.println(buf.get());
}

}

}

===================================================
//构造一个只读缓冲区

import java.nio.IntBuffer;

public class InetBufferTest3 {

public static void main(String[] args) {

IntBuffer buf = IntBuffer.allocate(8);
for(int i = 1 ; i <= 8 ; i++){
buf.put(i);
}

IntBuffer readonly = buf.asReadOnlyBuffer(); //构造了一个只读缓冲区
readonly.position(0); // 或者 readonly.flip();
while(readonly.hasRemaining()){
System.out.println(readonly.get());
}

}

}

===============================================

import java.nio.IntBuffer;

public class IntBufferTest1 {

public static void main(String[] args) {

IntBuffer buf = IntBuffer.allocate(8);

System.out.println(buf.position() +" "+ buf.limit() + " " + buf.capacity()); //输出结果:0 8 8

buf.put(1);

System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity()); //输出结果:1 8 8

//通过get方法去取其中的每一个元素
System.out.println(buf.get(0)); //输出结果:1
System.out.println(buf.get(1)); //输出结果:0,还没有为第2个元素赋值,说明它的所有元素初始值为0

//直接放一个数组
buf.put(new int[]{2,3,4});
System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());

//用以下方式去取出已经填充值的元素
buf.flip();//position变为0 limit变为上次的position

System.out.println(buf.position()+" " + buf.limit()+ " " + buf.capacity());

//hasRemaining 遍历position--->limit
while(buf.hasRemaining())
{
System.out.print(buf.get()+” “); //输出结果:1 2 3 4
}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值