NIO 中 buffer 的概念
NIO 中 buffer 的概念
程序员朱永胜有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准
https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
NIO 中 Buffer 的概念
在 Java NIO 中,Buffer是一个重要的组件,用来存储数据。当我们谈论 IO 时,通常会有一个缓存区(buffer)的概念,这是一个内存片段,可以存储从输入设备读入的数据,或者写入到输出设备的数据。在 NIO 库中,java.nio
包含了用来操作这些缓存区的类。
Buffer 类的结构
在 NIO 中,所有的 Buffer 类都继承自 java.nio.Buffer
这个抽象类。Buffer 类主要包含以下几个核心子类:
- ByteBuffer:用来存储字节数据,是 NIO 中使用频率最高的 Buffer。
- CharBuffer:用来存储字符数据,如字符串等。
- DoubleBuffer:用来存储 double 类型的数据。
- FloatBuffer:用来存储 float 类型的数据。
- IntBuffer:用来存储 int 类型的数据。
- LongBuffer:用来存储 long 类型的数据。
- ShortBuffer:用来存储 short 类型的数据。
Buffer 的关键属性
Buffer
类定义了四个属性,来提供关于其所包含数据的信息:
- capacity:容量,Buffer 最多可以存储的数据元素个数。创建后不能被改变。
- limit:限制,Buffer 中可以操作数据的大小(limit 后数据不能进行读写)。
- position:位置,下一个要被读或写的元素的索引。
- mark:标记,一个备忘位置。用于记录上一次读写的位置。
Buffer 的核心方法
为了操作这些缓冲区,Buffer 类提供了多种方法:
- **clear()**:将 position 设为 0,将 limit 设为容量,忽略标记。
- **flip()**:将 limit 设为当前 position,将 position 设为 0,忽略标记。
- **rewind()**:将 position 设为 0,保留 limit 不变,忽略标记。
- **mark()**:设置 mark 为当前的 position。
- **reset()**:将 position 设为标记的位置。
- **remaining()**:返回 position 与 limit 之间的元素个数。
- **hasRemaining()**:告知在当前 position 和 limit 之间是否有元素。
示例
下面是创建一个 ByteBuffer 实例的示例:
1 | // Allocate a new non-direct byte buffer with a 10 byte capacity |
在上面的代码中,我们首先通过 ByteBuffer.allocate()
创建了一个容量为 10 个字节的 ByteBuffer
实例。接着,我们往 Buffer 里面放入了字符串 “Hello” 的字节表示。之后,通过调用 flip()
方法,将 Buffer 从写模式翻转到读模式。最后,使用 hasRemaining()
和 get()
方法从 Buffer 中读取所有数据。当读操作完成后,我们可以使用 clear()
或 compact()
方法来清空或压缩 Buffer,为下一次写入准备。
Buffer 是 NIO 中与 Channel 交互的重要媒介,掌握其概念和使用方法是进行高效 IO 操作的关键。