- Java NIO Tutorial
- Java NIO - Home
- Java NIO - Overview
- Java NIO - Environment Setup
- Java NIO vs JAVA IO
- Java NIO - Channels
- Java NIO - File Channel
- Java NIO - DataGram Channel
- Java NIO - Socket Channel
- Java NIO - Server Socket Channel
- Java NIO - Scatter
- Java NIO - Gather
- Java NIO - Buffer
- Java NIO - Selector
- Java NIO - Pipe
- Java NIO - Path
- Java NIO - File
- Java NIO - AsynchronousFileChannel
- Java NIO - CharSet
- Java NIO - FileLock
- Java NIO Useful Resources
- Java NIO - Quick Guide
- Java NIO - Useful Resources
- Java NIO - Discussion
Java NIO - 缓冲区
Java NIO 中的缓冲区可以被视为一个简单的对象,它充当固定大小的数据块容器,可用于将数据写入通道或从通道读取数据,以便缓冲区充当通道的端点。
它提供了一组方法,可以更方便地处理内存块,以便从通道读取数据和向通道写入数据。
与经典 IO 相比,缓冲区使 NIO 包更高效、更快,因为 IO 数据以流的形式处理,不支持异步和并发数据流。此外 IO 不允许以块或字节组执行数据。
定义 Java NIO 缓冲区的主要参数可以定义为 -
容量- 可以存储在缓冲区中的最大数据/字节量。缓冲区的容量无法更改。一旦缓冲区已满,应在写入之前将其清除。
Limit - Limit 的含义取决于 Buffer 的模式,即在 Buffer Limit 的写入模式下等于容量,这意味着可以在 buffer 中写入的最大数据。而在 buffer 的读取模式下 Limit 意味着可以写入的数据量的限制从Buffer中读取。
Position - 指向缓冲区中光标的当前位置。在创建缓冲区时最初设置为 0,换句话说,它是要读取或写入的下一个元素的索引,通过 get() 和 put 自动更新() 方法。
Mark - 标记缓冲区中位置的书签。当调用 mark() 方法时,将记录当前位置,当调用 reset() 时,将恢复标记的位置。
缓冲器类型
Java NIO 缓冲区可以根据缓冲区处理的数据类型分为以下变体 -
- 字节缓冲区
- 映射字节缓冲区
- 字符缓冲区
- 双缓冲
- 浮动缓冲区
- 内部缓冲区
- 长缓冲区
- 短缓冲区
Buffer的重要方法
正如已经提到的,Buffer 作为内存对象,它提供了一系列方法,可以更方便地处理内存块。以下是 Buffer 的重要方法 -
allocate(intcapacity) - 此方法用于分配一个以容量为参数的新缓冲区。如果传递的容量为负整数,则分配方法会抛出 IllegalArgumentException。
read() 和 put() - 通道的 read 方法用于将数据从通道写入缓冲区,而 put 是缓冲区的一种方法,用于将数据写入缓冲区。
Flip() - Flip 方法将 Buffer 的模式从写入模式切换为读取模式。它还将位置设置回 0,并将限制设置为写入时位置的位置。
write() 和 get() - 通道的 write 方法用于将数据从缓冲区写入通道,而 get 是缓冲区的方法,用于从缓冲区读取数据。
rewind() - 当需要重读时使用 rewind 方法,因为它将位置设置回零并且不改变 limit 的值。
clear()和compact() -clear和compact这两种方法都用于使缓冲区从读取模式变为写入模式。clear()方法使位置为零,限制等于容量,在该方法中,缓冲区中的数据不会被清除,只是标记会被重新初始化。
另一方面,当仍然有一些未读数据并且我们仍然使用缓冲区的写入模式时,使用compact()方法,在这种情况下,compact方法将所有未读数据复制到缓冲区的开头,并将位置设置为最后一个未读元素之后.limit 属性仍然设置为capacity。
mark() 和 reset() - 顾名思义,mark 方法用于标记缓冲区中的任何特定位置,而重置则使位置回到标记位置。
例子
以下示例显示了上述定义方法的实现。
import java.nio.ByteBuffer; import java.nio.CharBuffer; public class BufferDemo { public static void main (String [] args) { //allocate a character type buffer. 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); //put character in buffer. 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()); } //set the position of buffer to 5. buffer.position(5); //sets this buffer's mark at its position buffer.mark(); //try to change the position buffer.position(6); //calling reset method to restore to the position we marked. //reset() raise InvalidMarkException if either the new position is less //than the position marked or merk has not been setted. 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