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; |
04 |
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 ); |
10 |
11 | buffer.putInt( 3 ); |
12 | buffer.putInt( 24 ); |
13 | buffer.putInt( 7 ); |
14 | System.out.println(buffer.toString()); |
15 | // 输出java.nio.HeapByteBuffer[pos=12 lim=1024 cap=1024] |
16 |
17 | buffer.flip(); |
18 | System.out.println(buffer.toString()); |
19 | // 输出java.nio.HeapByteBuffer[pos=0 lim=12 cap=1024] |
20 |
21 | fcout.write(buffer); |
22 | System.out.println(buffer.toString()); |
23 | // 输出java.nio.HeapByteBuffer[pos=12 lim=12 cap=1024] |
24 |
25 | buffer.clear(); |
26 | System.out.println(buffer.toString()); |
27 | // 输出java.nio.HeapByteBuffer[pos=0 lim=1024 cap=1024] |
28 | } |
29 | } |
当我们要将数据写到输出通道之前(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。
posted on 2010-06-09 09:33 阅读(...) 评论(...)