NIO Buffer

缺乏、安全感 2022-12-01 03:59 337阅读 0赞

java.nio包下的Buffer是一个抽象类,它本身是一个容器,称作缓冲区。

  1. public abstract class Buffer {
  2. ......
  3. }

其常见子类包括ByteBuffer、CharBuffer、LongBuffer、IntBuffer、DoubleBuffer、ShortBuffer、FloatBuffer(注意是没有Boolean类型的Buffer)

Buffer中比较重要的4个属性:position、limit、capacity、mark。

capacity(容量): 表示一个buffer能够容纳数据元素的最大数量,其取值不会为负数,一旦初始化便不可杯被改变

  1. //创建指定长度的缓冲区,其capacity的取值为10
  2. IntBuffer buf = IntBuffer.allocate(10);

limit():表示buffer中所装载的元素的个数
position:表示位置,一个buffer的position指的是下一个将要读或者写的元素的索引(索引的取值为0、1、2、3…),position的位置主要由get()和put()方法来进行更新。

常用方法:

flip():作用是用于复位,即先将limit的取值设置为position,然后再将position的取值设置为0,如下为源代码中该方法的具体操作

  1. public final Buffer flip() {
  2. limit = position; // 将limit设置为position
  3. position = 0; // position重置为0
  4. mark = -1; // 丢弃标记
  5. return this;
  6. }

get(int index): 作用是获取buffer中索引值为index的元素,该方法也称为绝对取出,不会影响position的位置

put(int index,int i):作用是将buffer中索引值为index的位置的值替换为新的取值 i,该方法也称为绝对存入,不会影响postion的位置

get():作用是获取buffer中position所处的位置的值,调用该方法后position的取值会加1

put(int i):作用是为buffer中position所处的位置赋值,调用该方法后position的取值会加1

以下为其子类IntBuffer的基本操作的代码展示:

  1. import java.nio.IntBuffer;
  2. public class TestBuffer {
  3. public static void main(String[] args) {
  4. // 1.基本操作
  5. //创建指定长度的缓冲区
  6. IntBuffer buf = IntBuffer.allocate(10); //初始化完成后position的取值为0
  7. buf.put(13); //调用put(int i)方法后,position的取值由0变为1
  8. buf.put(21); //调用put(int i)方法后,position的取值由1变为2
  9. buf.put(35); //调用put(int i)方法后,position的取值由2变为3
  10. buf.flip(); //flip()方法表示复位,position的取值由3变为0
  11. System.out.println("使用flip复位:" + buf);
  12. System.out.println("容量为: " + buf.capacity()); //容量一旦初始化后不允许改变(warp方法包裹数组除外)
  13. System.out.println("限制为: " + buf.limit()); //由于只装载了三个元素,所以可读取或者操作的元素为3 则limit=3
  14. System.out.println("获取下标为1的元素:" + buf.get(1));
  15. System.out.println("get(index)方法,position位置不改变:" + buf);
  16. buf.put(1, 4);
  17. System.out.println("put(index, change)方法,position位置不变:" + buf);
  18. for (int i = 0; i < buf.limit(); i++) {
  19. //调用get方法会使其缓冲区位置(position)向后递增一位
  20. System.out.println(buf.get() + "\t");
  21. }
  22. System.out.println("buf对象遍历之后为: " + buf);
  23. // 2.wrap方法使用
  24. /**
  25. // wrap方法会包裹一个数组: 一般这种用法不会先初始化缓存对象的长度,因为没有意义,最后还会被wrap所包裹的数组覆盖掉。
  26. // 并且wrap方法修改缓冲区对象的时候,数组本身也会跟着发生变化。
  27. int[] arr = new int[]{1,2,5};
  28. IntBuffer buf1 = IntBuffer.wrap(arr);
  29. System.out.println(buf1);
  30. IntBuffer buf2 = IntBuffer.wrap(arr, 0 , 2);
  31. //这样使用表示容量为数组arr的长度,但是可操作的元素只有实际进入缓存区的元素长度
  32. System.out.println(buf2);*/
  33. // 3 其他方法
  34. IntBuffer buf1 = IntBuffer.allocate(10);
  35. int[] arr = new int[]{1,2,5};
  36. buf1.put(arr);
  37. System.out.println(buf1);
  38. //一种复制方法
  39. IntBuffer buf3 = buf1.duplicate();
  40. System.out.println(buf3);
  41. //设置buf1的位置属性
  42. //buf1.position(0);
  43. buf1.flip();
  44. System.out.println(buf1);
  45. System.out.println("可读数据为:" + buf1.remaining());
  46. int[] arr2 = new int[buf1.remaining()];
  47. //将缓冲区数据放入arr2数组中去
  48. buf1.get(arr2);
  49. for(int i : arr2){
  50. System.out.print(Integer.toString(i) + ",");
  51. }
  52. }
  53. }

发表评论

表情:
评论列表 (有 0 条评论,337人围观)

还没有评论,来说两句吧...

相关阅读

    相关 NIOBuffer

    Buffer 其实在Buffer中官方的javadoc中已经讲得非常清楚了,本篇博客是本人做为笔记使用。 下面是我截取的javadoc很详细的介绍了关于mark,po

    相关 NIO之旅Buffer

    在上一篇文章中聊了一下[Channel][],这篇文章聊一下Java NIO中的另一个重要的组件:`Buffer`。 Buffer的概念 首先我们先看一下`Buffer

    相关 Java NIOBuffer

    缓冲区基础 本质上,缓冲区是就是一个数组。所有的缓冲区都具有四个属性来提供关于其所包含的数组的信息。它们是: 容量(Capacity) 缓冲区能够容纳的数据元素的

    相关 NIOBuffer

    > Java NIO中的Buffer用于和NIO通道进行交互。数据是从通道读入缓冲区,从缓冲区写入到通道中的。缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内

    相关 java NIObuffer

    Java NIO中的Buffer用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内