甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

java-Buffer

引言

说到缓冲区,不得不提Java NIO。

Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。

Java NIO: Channels and Buffers(通道和缓冲区)

什么是缓冲区

Buffer定义

代码的角度来讲(可以查看JDK中Buffer、ByteBuffer、DoubleBuffer等的源码),Buffer类内部其实就是一个基本数据类型的数组,以及对这个缓冲数组的各种操作;

常见的缓冲区如ByteBuffer、IntBuffer、DoubleBuffer...内部对应的数组依次是byte、int、double...

Buffer与通道的关系

标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中

继承结构

以ByteBuffer为例:

Buffer是顶层抽象类,ByteBuffer继承Buffer,也是抽象类,ByteBuffer最常见的两个具体实现类如下:

DirectByteBuffer(JVM堆外部、通过unsafe.allocateMemory实现)、HeapByteBuffer(JVM堆)

缓冲区用途

写,然后读出

缓冲区的四个属性

  • 容量(capacity) capacity指的是缓冲区能够容纳元素的最大数量,这个值在缓冲区创建时被设定,而且不能够改变,如下,我们创建了一个最大容量为10的字节缓冲区;

      ByteBuffer bf = ByteBuffer.allocate(10);
  • 上界(limit) limit指的是缓冲区中第一个不能读写的元素的数组下标索引,也可以认为是缓冲区中实际元素的数量;

  • 位置(position) position指的是下一个要被读写的元素的数组下标索引,该值会随get()和put()的调用自动更新;

  • 标记(mark) 一个备忘位置,调用mark()方法的话,mark值将存储当前position的值,等下次调用reset()方法时,会设定position的值为之前的标记值;

  • 四个属性值之间的关系 根据以上四个属性的定义,我们可以总结出它们之间的关系如下: 0 <= mark <= position <= limit <= capacity

缓冲区调用一般步骤

  1. 写入数据到 Buffer
  2. 调用flip()方法
  3. 从 Buffer 中get()数据
  4. 调用clear()方法或者compact()方法

参考文献

  1. Java NIO中的缓冲区Buffer(一)缓冲区基础
  2. [Java编程思想2]