![](https://csdnimg.cn/release/download_crawler_static/86345102/bg4.jpg)
FileOutputStream fout = new FileOutputStream( "writesomebytes.txt" );
FileChannel fc = fout.getChannel();
下一步是创建一个缓冲区并在其中放入一些数据 - 在这里,数据将从一个名为
message 的数组中取出,这个数组包含字符串 "Some bytes" 的 ASCII 字节(本教
程后面将会解释 buffer.flip() 和 buffer.put() 调用)。
?
ByteBuffer buffer = ByteBuffer.allocate( 1024 );
for (int i=0; i<message.length; ++i) {
buffer.put( message[i] );
}
buffer.flip();
最后一步是写入缓冲区中
?
注意在这里同样不需要告诉通道要写入多数据。缓冲区的内部统计机制会跟踪它
包含多少数据以及还有多少数据要写入。
读写结合
下面我们将看一下在结合读和写时会有什么情况。我们以一个名为 CopyFile.java
的简单程序作为这个练习的基础,它将一个文件的所有内容拷贝到另一个文件中。
CopyFile.java 执行三个基本操作:首先创建一个 Buffer,然后从源文件中将数据
读到这个缓冲区中,然后将缓冲区写入目标文件。这个程序不断重复 ― 读、写、
读、写 ― 直到源文件结束。
CopyFile 程序让您看到我们如何检查操作的状态,以及如何使用 clear() 和 flip()
方法重设缓冲区,并准备缓冲区以便将新读取的数据写到另一个通道中。
运行 CopyFile 例子
因为缓冲区会跟踪它自己的数据,所以 CopyFile 程序的内部循环 (inner loop)
非常简单,如下所示:
?
fcin.read( buffer );
fcout.write( buffer );
第一行将数据从输入通道 fcin 中读入缓冲区,第二行将这些数据写到输出通道
fcout 。
检查状态
下一步是检查拷贝何时完成。当没有更多的数据时,拷贝就算完成,并且可以在
read() 方法返回 -1 是判断这一点,如下所示:
?
int r = fcin.read( buffer );
if (r==-1) {
break;
}
重设缓冲区
最后,在从输入通道读入缓冲区之前,我们调用 clear() 方法。同样,在将缓冲区