fcin.read( buffer ); fcout.write( buffer ); |
第一行将数据从输入通道 fcin
中读入缓冲区,第二行将这些数据写到输出通道 fcout
。
下一步是检查拷贝何时完成。当没有更多的数据时,拷贝就算完成,并且可以在 read()
方法返回 -1 是判断这一点,如下所示:
int r = fcin.read( buffer );
if (r==- 1 ) {
break ;
} |
最后,在从输入通道读入缓冲区之前,我们调用 clear()
方法。同样,在将缓冲区写入输出通道之前,我们调用 flip()
方法,如下所示
1
2
3
4
5
6
7
8
9
|
buffer.clear(); int r = fcin.read( buffer );
if (r==- 1 ) {
break ;
} buffer.flip(); fcout.write( buffer ); |
clear()
方法重设缓冲区,使它可以接受读入的数据。 flip()
方法让缓冲区可以将新读入的数据写入另一个通道。
缓冲区内部细节
本节将介绍 NIO 中两个重要的缓冲区组件:状态变量和访问方法 (accessor)。
状态变量是前一节中提到的"内部统计机制"的关键。每一个读/写操作都会改变缓冲区的状态。通过记录和跟踪这些变化,缓冲区就可能够内部地管理自己的资源。
在从通道读取数据时,数据被放入到缓冲区。在有些情况下,可以将这个缓冲区直接写入另一个通道,但是在一般情况下,您还需要查看数据。这是使用 访问方法 get()
来完成的。同样,如果要将原始数据放入缓冲区中,就要使用访问方法 put()
。
在本节中,您将学习关于 NIO 中的状态变量和访问方法的内容。我们将描述每一个组件,并让您有机会看到它的实际应用。虽然 NIO 的内部统计机制初看起来可能很复杂,但是您很快就会看到大部分的实际工作都已经替您完成了。您可能习惯于通过手工编码进行簿记 ― 即使用字节数组和索引变量,现在它已在 NIO 中内部地处理了。