Java NIO - Buffer(缓冲区)

Java NIO - Buffer(缓冲区) 首页 / Nio入门教程 / Java NIO - Buffer(缓冲区)

Java NIO中的缓冲区(Buffer)充当固定大小的数据块容器,可用于将数据写入通道或从通道读取数据。

与传统IO相比,缓冲区使NIO包更高效,更快,因为IO数据不支持异步和并发数据流的流形式进行处理,并且IO不允许以块或字节组的形式执行数据。

定义Java NIO缓冲区的主要参数可以定义为-

  • Capacity     - 缓冲区中可以存储的最大数据量/字节,容量不可更改,缓冲区已满后,应在写入之前将其清除它。

  • Limit           - 在缓冲区的写模式下,Limit等于容量,这意味着可以在缓冲区中写入的最大数据。

  • Position      - 指向游标在缓冲区中的当前位置。在创建缓冲区时最初设置为0,读取或写入,并通过get()和put()方法自动更新。

  • Mark            - 在缓冲区中表示当前位置。调用mark()方法时,将记录当前位置,而当调用reset()时,将还原mark的位置。

缓冲区类型

Java NIO缓冲区可以根据缓冲区处理的数据类型分为以下几种:

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

缓冲的重要方法

如前所述,Buffer充当内存对象,以下是Buffer的重要方法-

  • allocate(int Capacity)      - 此方法用于分配Capacity为参数的新缓冲区,如果传递的容量为负整数,则分配方法将抛出IllegalArgumentException。

  • read()和put()                     - 通道的read方法用于将通道数据写入缓冲区,而put是用于将数据直接写入缓冲区。

  • flip()                                     - flip方法将Buffer的模式从写入模式切换到读取模式,还将位置重新设置为0。

  • write()和get()                     - 通道的write方法用于将数据从缓冲区写到通道,而get方法从缓冲区读取数据。

  • rewind()                               - 需要重读时使用rewind方法,因为它将位置重新设置为0并且不更改limit的值。

  • clear()和compact()            - 这两种方法都使缓冲区从读模式变为写模式。clear()方法将位置设置为0且limit等于Capacity。compact()方法将所有未读数据复制到缓冲区的开头并将位置设置为最后一个未读元素之后,limit属性仍设置为Capacity。

  • mark()和reset()                  - mark方法用于在缓冲区中的标签位置,同时reset使位置回到标签位置。

Buffer示例

以下示例显示了上述方法的实现。

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class BufferDemo {
   public static void main (String [] args) {
      //分配一个字符类型缓冲区.
      CharBuffer buffer = CharBuffer.allocate(10);
      String text = "bufferDemo";
      System.out.println("Input text: " + text);
      for (int i = 0; i < text.length(); i++) {
         char c = text.charAt(i);
         //将字符放入缓冲区。
		 buffer.put(c);
      }
      int buffPos = buffer.position();
      System.out.println("Position after data is written into buffer: " + buffPos);
      buffer.flip();
      System.out.println("Reading buffer contents:");
      while (buffer.hasRemaining()) {
         System.out.println(buffer.get());                   
      }
      //将缓冲区的位置设置为 5。
      buffer.position(5);
      //将此缓冲区的标记设置在其位置
      buffer.mark();
      //尝试改变位置
      buffer.position(6);
      //调用reset方法恢复到我们标记的位置。
      //reset() 如果新位置小于,则引发 InvalidMarkException
      //比标记的位置或merk 尚未设置。
      buffer.reset();
      System.out.println("Restored buffer position : " + buffer.position());
   }
}

运行上面代码输出

Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

技术与商业案例解读 -〔徐飞〕

推荐系统三十六式 -〔刑无刀〕

重学前端 -〔程劭非(winter)〕

透视HTTP协议 -〔罗剑锋(Chrono)〕

性能测试实战30讲 -〔高楼〕

Linux内核技术实战课 -〔邵亚方〕

WebAssembly入门课 -〔于航〕

动态规划面试宝典 -〔卢誉声〕

Rust 语言从入门到实战 -〔唐刚〕

好记忆不如烂笔头。留下您的足迹吧 :)