Buffer使用步骤
- 从Channel中读入数据到buffer
- 调用
buffer.flip()调转方向 - 从buffer中读取数据
- 调用
buffer.clear()或者buffer.compact()
- 从Channel中读取数据到buffer,buffer会记录读入了多少数据,目前是写模式
- 一旦你想从buffer中拿走这些数据,你需要从写模式转换到读取模式
- 在读取模式中,你可以读取buffer中的所有数据
- 一旦你读取完了数据,你需要清空buffer,方便下次写入,有两种方式clear会清空buffer,compact会将读取过的清空,保留没有读取过的,并压缩到buffer的开始。
示例讲解
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");FileChannel inChannel = aFile.getChannel();// 分配48字节的内存作为bufferByteBuffer buf = ByteBuffer.allocate(48);int bytesRead = inChannel.read(buf); //从文件中写入数据到buffer中while (bytesRead != -1) { buf.flip(); //切换模式,从写模式切换到读模式 while(buf.hasRemaining()){ System.out.print((char) buf.get()); // 每次只读1个字节,直到buffer为空 } buf.clear(); //清空buffer,为下次写入做准备 bytesRead = inChannel.read(buf);// 从文件中写入数据到buffer中}aFile.close();// 关闭文件
写入模式 VS 读取模式
写入模式

- capacity永远不动
limit = capcity
读取模式

limit = position
position = 0
总结
capacity永远不动
- position永远向limit移动
- 写入时limit与capacity相同,代表最大能写入的位置,读取时limit是最大能读取到的位置。
- position永远从0开始