1.Buffer的基本用法
Buffer是和Channel一块使用的,首先来看一段代码:
public class Buffer {
public static void main(String[] args) throws IOException {
//获取文件流
RandomAccessFile inFile = new RandomAccessFile("C:\\test\\input.txt", "rw");
RandomAccessFile outFile = new RandomAccessFile("C:\\test\\output.txt", "rw");
//获取通道
FileChannel in = inFile.getChannel(),
out = outFile.getChannel();
//分配Buffer大小为48字节
ByteBuffer buf = ByteBuffer.allocate(48);
while(in.read(buf) != -1){
//调用flip()为把Buffer的数据写到Channel做准备
buf.flip();
//将Buffer的数据写到Channel中
out.write(buf);
//清空Buffer为下一次从Channel读取数据到Buffer做准备
buf.clear();
}
inFile.close();
outFile.close();
}
}
增加格式化后输出如下:
Before read() :
position:0,limit:48,capacity:48
After read() :
position:17,limit:48,capacity:48
Before flip() :
position:17,limit:48,capacity:48
After flip() :
position:0,limit:17,capacity:48
Before write() :
position:0,limit:17,capacity:48
After write() :
position:17,limit:17,capacity:48
Before clear() :
position:17,limit:17,capacity:48
After clear() :
position:0,limit:48,capacity:48
2. position,limit,capacity
Buffer有三个重要的参数:position,limit,capacity,要解释上面的结果先了解这三个参数在Buffer的读模式和写模式时发生了什么变化。下面是示意图(搬运工):
在Bufer的写模式中(调用的是Channel的读方法:in.read(buf);读和写是相对的,此时对Buffer来说因为数据是写入的,所以是写模式),position最初指向最开始的位置,limit和capacity指向最末的位置(写模式中limit和capacity值是一样的),
随着数据的不断写入,limit和capacity位置不变,而position位置不断后移,直到达到limit的位置。
在Buffer的读模式中(调用的是Channel的读方法:out.write(buf);),position最初指向最开始的位置,limit指向写入Buffer数据量大小的位置,capacity指向最末位置。随着数据的不断读取,limit和capacity位置不变,而position位置不断后移,直到达到limit的位置。
3.flip()和clear()做了什么?
flip()方法就是将Buffer置于读模式,而clear()方法就是将Buffer置于写模式的最初状态。