有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准
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实例的示例:
// Allocate a new non-direct byte buffer with a 10 byte capacity
ByteBuffer buf = ByteBuffer.allocate(10);
// Writes the given byte into this buffer at the current position,
// and then increments the position
buf.put((byte) 'H');
buf.put((byte) 'e');
buf.put((byte) 'l');
buf.put((byte) 'l');
buf.put((byte) 'o');
// Flip the buffer for reading
buf.flip();
// Read bytes from the buffer
while (buf.hasRemaining()) {
char c = (char) buf.get();
System.out.print(c);
}
在上面的代码中,我们首先通过ByteBuffer.allocate()创建了一个容量为10个字节的ByteBuffer实例。接着,我们往Buffer里面放入了字符串"Hello"的字节表示。之后,通过调用flip()方法,将Buffer从写模式翻转到读模式。最后,使用hasRemaining()和get()方法从Buffer中读取所有数据。当读操作完成后,我们可以使用clear()或compact()方法来清空或压缩Buffer,为下一次写入准备。
Buffer是NIO中与Channel交互的重要媒介,掌握其概念和使用方法是进行高效IO操作的关键。
本文是原创文章,采用 CC BY-NC-SA 4.0 协议,完整转载请注明来自 小朱
评论
隐私政策
0/500
滚动到此处加载评论...


