我尝试使用AsynchronousFileChannel来实现复制文件。用于读取和写入的AsynchronousFileChannel对象声明为
AsynchronousFileChannel asyncRead = AsynchronousFileChannel.open(sourcePath);
AsynchronousFileChannel asyncWrite = AsynchronousFileChannel.open(targetPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
读取的CompletionHandler看起来像
CompletionHandler<Integer, ByteBuffer> handlerRead = new CompletionHandler<Integer, ByteBuffer>() {
@Override
public void completed(Integer arg0, ByteBuffer arg1) {
System.out.println("finished read ...");
// question line
asyncWrite.write(ByteBuffer.wrap(arg1.array()), 0, null, handlerWrite);
}
@Override
public void failed(Throwable arg0, ByteBuffer arg1) {
System.out.println("failed to read ...");
}
};
然后我开始通过
读取文件asyncRead.read(buffer, 0, buffer, handlerRead);
问题是,在阅读完成后,如果我写文件(请参阅评论&#34;问题行&#34;看看它的名称)
// no output
asyncWrite.write(arg1, 0, null, handlerWrite);
不会写出任何内容。我必须再次包装缓冲区
// works fine
asyncWrite.write(ByteBuffer.wrap(arg1.array()), 0, null, handlerWrite);
为了看到写出来的内容
我的问题是,我必须使用ByteBuffer来包装另一个ByteBuffer的内容是什么原因?
答案 0 :(得分:3)
我必须使用ByteBuffer来包装另一个ByteBuffer的内容是什么原因?
你没有。您应该翻转原始ByteBuffer
。您通过调用wrap()
获得了类似的效果,position
将新包装的ByteBuffer
的{{1}}设置为零。