首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java AsynchronousFileChannel和ByteBuffer

Java AsynchronousFileChannel和ByteBuffer
EN

Stack Overflow用户
提问于 2014-11-10 02:43:01
回答 1查看 494关注 0票数 1

我尝试使用AsynchronousFileChannel实现复制文件。用于读写的AsynchronousFileChannel对象声明为

代码语言:javascript
复制
AsynchronousFileChannel asyncRead = AsynchronousFileChannel.open(sourcePath);
AsynchronousFileChannel asyncWrite = AsynchronousFileChannel.open(targetPath, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

读的CompletionHandler看起来像

代码语言:javascript
复制
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 ...");
        }
    };

然后我开始读取文件

代码语言:javascript
复制
asyncRead.read(buffer, 0, buffer, handlerRead);

问题是,在读取完成后,如果我写入文件(请参阅注释“问题行”以查看它的调用位置)。

代码语言:javascript
复制
// no output
asyncWrite.write(arg1, 0, null, handlerWrite);

不会有任何内容被写出来。我必须再次包装缓冲器

代码语言:javascript
复制
// works fine
asyncWrite.write(ByteBuffer.wrap(arg1.array()), 0, null, handlerWrite);

为了看到写出来的内容

我的问题是,为什么我必须使用ByteBuffer来包装另一个ByteBuffer的内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-10 02:50:04

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

你没有,你应该换掉原来的ByteBuffer。通过调用wrap()获得了类似的效果,它将新包装的ByteBufferposition设置为零。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26835948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档