下面这个例子用FileChannel作为IO操作者(当然你也可以用SocketChannel)
定义用于每次循环中存放数据的StringBuffer实例sb
定义容量为1024byte的ByteBuffer实例bb
定义原始的FileInputStream实例fis,关联到E盘的叫做1.txt的文本文件
用fis来获取FileChannel实例fc
循环将管道(这里是FileChannel)中的数据写到ByteBuffer实例bb中去,并将bb中的数据追加到StringBuffer实例去,最后将StringBuffer中的内容打印出来。
这里要注意的是ByteBuffer的hasRemaining()方法是用来判断Buffer中是否还有数据没被处理过。filp()是将limit置为position,position置为0。clear()是将position置为0,limit置为capacity。
·以下为完整的代码:
改正错误:上面连续读取的那个while循环的边界条件应该要改为i > 0才是最佳的。因为i不一定是都会是取到-1这个边界值得,可能会取到比-1小的数,这个时候就会陷入死循环中...在FileChannel中这种情况比较少见,而在SocketChannel中,这种情况则是会发生的。我就是在写基于NIO的echoServer的时候发现这个问题的。