Java NIO里关键的Buffer实现:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
这些Buffer覆盖了你能通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。
Java NIO 还有个 MappedByteBuffer,用于表示内存映射文件。
使用Buffer读写数据一般遵循以下四个步骤:
-
写入数据到Buffer
-
调用
flip()
方法 -
从Buffer中读取数据
-
调用
clear()
方法或者compact()
方法
当向buffer写入数据时,buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到buffer的所有数据。一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。有两种方式能清空缓冲区:调用clear()或compact()方法。clear()方法会清空整个缓冲区。compact()方法只会清除已经读过的数据。任何未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
向Buffer中写数据:
- 从Channel写到Buffer (fileChannel.read(buf))
- 通过Buffer的put()方法 (buf.put(…))
从Buffer中读取数据:
- 从Buffer读取到Channel (channel.write(buf))
- 使用get()方法从Buffer中读取数据 (buf.get())
代码示例
package com.boshrong.nio;
import java.nio.IntBuffer;
public class BasicBuffer {
public static void main(String[] args) {
// 举例说明buffer的使用
// 创建能存放5个整型的buffer
IntBuffer allocate = IntBuffer.allocate(5);
//向buffer 中存放数据
for(int i=0;i<allocate.capacity();i++){
allocate.put(i+10);
}
// 从buffer中读取数据
// 将buffer转化,读写切换
allocate.flip();
// 其第岑维护着一个索引,调用get后移一位
System.out.println(allocate.get());
while(allocate.hasRemaining()){
System.out.println(allocate.get());
}
allocate.clear();
}
}