NIO入门-了解Buffer
Buffer实例的状态由下面三个变量来决定:
- Position,这个变量表明已经读写了多少数据;
- Limit,这个变量表明还有多少数据需要读写;
- Capacity,这个变量表明缓冲区的最大容量。
从大小关系来看,Position≤Limit≤Capacity。在通过Buffer进行读写的时候,Buffer.clear()和Buffer.flip()这两个函数将会改变这三个变量,我们可以通过下面这个例子来查看这个过程:
01 |
import java.io.FileOutputStream; |
02 |
import java.nio.ByteBuffer; |
03 |
import java.nio.channels.FileChannel; |
05 |
public class WriteFile { |
06 |
static public void main(String args[]) throws Exception { |
07 |
FileOutputStream fout = new FileOutputStream( "out.txt" ); |
08 |
FileChannel fcout = fout.getChannel(); |
09 |
ByteBuffer buffer = ByteBuffer.allocate( 1024 ); |
14 |
System.out.println(buffer.toString()); |
18 |
System.out.println(buffer.toString()); |
22 |
System.out.println(buffer.toString()); |
26 |
System.out.println(buffer.toString()); |
当我们要将数据写到输出通道之前(fux注:即调用session.write方法前),我们必须调用 flip() 方法。这个方法做了两件事情:
- 它将 limit 设置为当前 position,在WriteFile.class中,limit被设置成12,这意味着Buffer实例中保存了12字节数据;
- 它将 position 设置为 0,在WriteFile.class中,position被设置成0,这意味着Buffer实例下一个读写的位置从0开始。
而clear() 方法会重设缓冲区以便接收更多的字节,这个方法做了两件事情:
- 它将 limit 设置为与 capacity 相同。
- 它设置 position 为 0。