Java AsynchronousFileChannel和ByteBuffer

时间:2014-11-10 02:43:01

标签: java bytebuffer java.nio.file

我尝试使用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的内容是什么原因?

1 个答案:

答案 0 :(得分:3)

  

我必须使用ByteBuffer来包装另一个ByteBuffer的内容是什么原因?

你没有。您应该翻转原始ByteBuffer。您通过调用wrap()获得了类似的效果,position将新包装的ByteBuffer的{​​{1}}设置为零。