ByteBuffer的一个问题

excellent_chen 2010-10-28 06:33:23
在看thingking in java,看到nio这里,有点不明白:
程序如下:

import java.io.* ;
import java.nio.* ;
import java.nio.channels.* ;

public class ChannelCopy {
private static final int BSIZE = 1024 ;
public static void main(String[] args) throws Exception {
if(args.length != 2) {
System.out.println("arguments : sourcefile destfile");
System.exit(1);
}
FileChannel
in = new FileInputStream(args[0]).getChannel() ,
out = new FileOutputStream(args[1]).getChannel() ;
ByteBuffer buffer = ByteBuffer.allocate(BSIZE) ;
while(in.read(buffer) != -1) {
buffer.flip() ;
out.write(buffer);
buffer.clear() ;
}
}
}


书上说一旦调用read()来告知FileChannel向ByteBuffer存储字节,就必须调用缓冲器上的flip(),让它做好让别人读取字节的准备,如果打算使用缓冲器执行进一步的read()操作,必须得调用clear()来为每个read()做准备。
这段话有些不明白,望高人指点啊。
...全文
316 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwb_1988 2010-10-28
  • 打赏
  • 举报
回复
当使用channel时, in.read(buffer) 是从物理硬盘上读取数据到缓冲。buffer.flip 会停止物理读取,而把指针调到缓冲的开始(最初读的一个数据),然后out.write(buffer)可以从缓冲的开始写出数据。最后buffer.clear来清空缓冲。
caofaping 2010-10-28
  • 打赏
  • 举报
回复
API:
clear() 使缓冲区为一系列新的通道读取或相对放置 操作做好准备:它将限制设置为容量大小,将位置设置为 0。

flip() 使缓冲区为一系列新的通道写入或相对获取 操作做好准备:它将限制设置为当前位置,然后将位置设置为 0。

个人理解
clear()清空缓冲区数据
flip() 缓冲区索引指向当前位置

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧