在AsynchronousFileChannel中,CompletionHandler用于读取数据有什么用?

时间:2016-12-12 10:23:43

标签: java java-8 nio filechannel

我正在使用AsynchronousFileChannel来读取数据。 为了读取数据,我发现了两种读取方法如下:

//1.
Future<Integer> java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position);

//2.
void java.nio.channels.AsynchronousFileChannel.read(ByteBuffer dst, long position, A attachment, CompletionHandler<Integer, ? super A> handler)

正如下面指定的java文档,没有关于CompletionHandler被用作函数的第三个参数的信息:

  

从给定的文件位置开始,从该通道读取一个字节序列到指定的缓冲区。

     

此方法从给定文件位置开始,从该通道读取一个字节序列到给定缓冲区。读取的结果是读取的字节数,如果给定的位置大于或等于尝试读取时文件的大小,则为-1。

     

此方法的工作方式与AsynchronousByteChannel.read(ByteBuffer,Object,CompletionHandler)方法的工作方式相同,只是从给定的文件位置开始读取字节。如果给定的文件位置大于尝试读取时文件的大小,则不读取任何字节。

有人能告诉我第三个参数,以及CompletionHandler的任何工作示例吗?为什么我们需要CompletionHandler以及它的用法是什么?

1 个答案:

答案 0 :(得分:2)

以下是我搜索并按如下方式工作的示例:

try(AsynchronousFileChannel asyncfileChannel = AsynchronousFileChannel.open(Paths.get("/Users/***/Documents/server_pull/system_health_12_9_TestServer.json"), StandardOpenOption.READ)){
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ByteBuffer attachment = ByteBuffer.allocate(1024);
        asyncfileChannel.read(buffer, 0, attachment, new CompletionHandler<Integer, ByteBuffer>() {
            @Override
            public void completed(Integer result, ByteBuffer attachment) {
                System.out.println("result = " + result);

                attachment.flip();
                byte[] data = new byte[attachment.limit()];
                attachment.get(data);
                System.out.println(new String(data));
                attachment.clear();
            }

            @Override
            public void failed(Throwable exc, ByteBuffer attachment) {

            }
        });
    }catch(Exception e){
        e.printStackTrace();
    }

以下是处理细节:

  

读取操作完成后,将调用CompletionHandler的completed()方法。传递给completed()方法的参数传递一个Integer,告诉读取了多少字节,以及传递给read()方法的“attachment”。 “attachment”是read()方法的第三个参数。在这种情况下,也是ByteBuffer,数据也被读入。

如果读操作失败,则会调用CompletionHandler的failed()方法。