【问题标题】:What is the use of CompletionHandler in AsynchronousFileChannel for reading data?AsynchronousFileChannel中的CompletionHandler读取数据有什么用?
【发布时间】:2017-04-27 04:32:08
【问题描述】:

我正在使用 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 你得到一个Future&lt;Integer&gt;,在#2 你传递你自己的CompletionHandler 以在操作完成时执行。另见docs.oracle.com/javase/7/docs/api/java/nio/channels/…
  • 来自Javadoc:“handler 参数是一个完成处理程序,在读取操作完成(或失败)时调用。传递给完成处理程序的结果是读取的字节数或 -如果由于通道已到达流尾而无法读取任何字节,则为 1。"

标签: java java-8 nio filechannel


【解决方案1】:

这是我搜索并使其工作的示例如下:

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() 方法将被调用。作为已完成()方法的参数,传递了一个整数,告诉您读取了多少字节,以及传递给 read() 方法的“附件”。 “附件”是 read() 方法的第三个参数。在这种情况下,也是读取数据的 ByteBuffer。

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

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多