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实例的示例:

// 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操作的关键。

最后更新于