Buffer使用步骤

  1. 从Channel中读入数据到buffer
  2. 调用buffer.flip()调转方向
  3. 从buffer中读取数据
  4. 调用buffer.clear()或者buffer.compact()
    1. 从Channel中读取数据到buffer,buffer会记录读入了多少数据,目前是写模式
    2. 一旦你想从buffer中拿走这些数据,你需要从写模式转换到读取模式
    3. 在读取模式中,你可以读取buffer中的所有数据
    4. 一旦你读取完了数据,你需要清空buffer,方便下次写入,有两种方式clear会清空buffer,compact会将读取过的清空,保留没有读取过的,并压缩到buffer的开始。

示例讲解

  1. RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw");
  2. FileChannel inChannel = aFile.getChannel();
  3. // 分配48字节的内存作为buffer
  4. ByteBuffer buf = ByteBuffer.allocate(48);
  5. int bytesRead = inChannel.read(buf); //从文件中写入数据到buffer中
  6. while (bytesRead != -1) {
  7. buf.flip(); //切换模式,从写模式切换到读模式
  8. while(buf.hasRemaining()){
  9. System.out.print((char) buf.get()); // 每次只读1个字节,直到buffer为空
  10. }
  11. buf.clear(); //清空buffer,为下次写入做准备
  12. bytesRead = inChannel.read(buf);// 从文件中写入数据到buffer中
  13. }
  14. aFile.close();// 关闭文件

写入模式 VS 读取模式

写入模式

image.png

  1. capacity永远不动
  2. limit = capcity

    读取模式

    image.png

  3. limit = position

  4. position = 0

    总结

  5. capacity永远不动

  6. position永远向limit移动
  7. 写入时limit与capacity相同,代表最大能写入的位置,读取时limit是最大能读取到的位置。
  8. position永远从0开始