参考:https://www.cnblogs.com/ostenant/p/9695177.html
在Java NIO中,缓冲区用来临时存储数据,可以理解为是I/O操作中数据暂存的中转站。缓冲区直接为通道(Channel)服务,数据是从通道读入缓冲区,从缓冲区写入到通道中的。
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问这块内存。
Buffer的类型
Java NIO提供以下几种Buffer类型:
- ByteBuffer
- MappedByteBuffer
- ShortBuffer
- LongBuffer
- FloatBuffer
- CharBuffer
- IntBuffer
- DoubleBuffer
这些Buffer类型代表了Java中7种基本数据类型。换句话说,就是可以通过byte、char、short、int、long、float或double类型来操作缓冲区中的数据。
Buffer的基本用法
使用Buffer读写数据一般遵循以下四个步骤:
- 写入数据到Buffer中;
- 调用Buffer的flip()方法;
- 从Buffer中读取数据;
- 调用clear()方法或者compact()方法。
当向Buffer写入数据时,Buffer会记录下写了多少数据。一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式。在读模式下,可以读取之前写入到Buffer的所有数据。
一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。两种方式能清空缓冲区:调用clear()或compact()方法。
clear()方法:清空整个缓冲区,包括已读和未读的数据。
compact()方法:只会清空已读的数据,未读的数据都被移到缓冲区的起始处,新写入的数据将放到缓冲区未读数据的后面。
下面给出一个ByteBuffer的简单使用示例,其他缓冲区API的使用类似:
package com.example.dtest.nio.buffer;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class BufferTest01 {
public static void main(String[] args) {
testReadFromBuffer();
}
public static void testReadFromBuffer(){
try {
RandomAccessFile randomAccessFile = new RandomAccessFile("D:\\test.txt", "rw");
FileChannel fileChannel = randomAccessFile.getChannel();
StringBuilder stringBuilder = new StringBuilder();
// 创建容量为10byte的buffer
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
// 不断地写入缓冲区,写一次读一次
while (fileChannel.read(byteBuffer) != -1){
// 设置buffer切换模式为读模式
byteBuffer.flip();
while (byteBuffer.hasRemaining()){
// 每次读取1byte,也就是1字节
// System.out.println((char) byteBuffer.get());
stringBuilder.append((char) byteBuffer.get());
}
// 清空整个缓冲区,准备下次写入
byteBuffer.clear();
}
System.out.println(stringBuilder.toString());
fileChannel.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}
}
}
结果: