深入理解 Java NIO:ByteBuffer和MappedByteBuffer的特性与使用
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class NIOExample {
public static void main(String[] args) {
// 创建一个ByteBuffer,容量为1024
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 可以看到buffer的初始状态
printBufferStatus(buffer, "New ByteBuffer");
// 写入一些数据到buffer
buffer.put("Hello, World!".getBytes());
// 切换到读模式
buffer.flip();
// 读取数据并打印
byte[] bytes = new byte[buffer.limit()];
buffer.get(bytes);
System.out.println("Contents: " + new String(bytes));
// 再次查看buffer状态
printBufferStatus(buffer, "After flip()");
// 使用MappedByteBuffer进行文件映射
try (FileChannel fileChannel = FileChannel.open(Paths.get("test.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE)) {
MappedByteBuffer mappedBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
// 将字符串写入映射的内存区域
mappedBuffer.put("Hello, Mapped File".getBytes());
// 对MappedByteBuffer进行了修改,需要调用force()方法将修改写回磁盘
mappedBuffer.force();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printBufferStatus(Buffer buffer, String message) {
System.out.println(message + ":\nposition: " + buffer.position()
+ "\nlimit: " + buffer.limit()
+ "\ncapacity: " + buffer.capacity()
+ "\nhasRemaining: " + buffer.hasRemaining());
}
}
这段代码首先创建了一个ByteBuffer
,并展示了它的初始状态。然后,它向buffer中写入一些数据,并将buffer切换到读模式来读取数据。最后,它演示了如何使用MappedByteBuffer
来映射和操作文件。这个例子简单直观地展示了NIO中两个核心缓冲区类型的基本用法。
评论已关闭