ByteBuffer 用法及其内部结构 #
1 ByteBuffer 基础用法 #
1.1 需求 #
利用 ByteBuffer 将一个 txt 文件的内容全部读取并打印,要求 ByteBuffer 只分配10字节。文件内容如下:
1234567890abcd
1.2 步骤 #
- 分配 10 字节容量给缓冲区;
- 获取文件通道;
- 从通道写数据进缓冲区;
- 切换缓冲区为读模式;
- 读取缓冲区的内容并打印;
- 切换缓冲区为写模式;
- 循环步骤 3-6,直到步骤 3 中的通道已经没有数据可读;
1.3 代码 #
public class ByteBufferTest {
public static void main(String[] args) throws IOException {
// allocate分配 10字节
ByteBuffer buffer = ByteBuffer.allocate(10);
// 获取文件通道
FileInputStream fis = new FileInputStream("D:/test.txt");
FileChannel fc = fis.getChannel();
while (true) {
// 从通道读数据写进缓冲区
int length = fc.read(buffer);
// -1表示文件读完
if (length == -1) {
break;
}
// 缓冲区读模式
buffer.flip();
while (buffer.hasRemaining()) {
System.out.println((char) buffer.get());
}
// 缓冲区写模式
buffer.clear();
}
}
}
2 ByteBuffer 内部结构 #
我们结合 1.3 的程序来探讨 ByteBuffer 的内部结构。
- 分配 10 字节容量给缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
- 从通道写数据进缓冲区
int length = fc.read(buffer); // length==10
- 切换缓冲区为读模式
buffer.flip();
- 从缓冲区读数据并打印
System.out.println((char) buffer.get());
内层循环执行了3次后的情况:
内层循环执行到结束的情况:
- 清空缓存区,切换为写模式,并进入下一次循环写入数据
buffer.clear();
int length = fc.read(buffer);
- 切换为读模式
buffer.flip();
- 所有数据读取完毕
int length = fc.read(buffer); // length == -1