我正在使用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以及它的用法是什么?
答案 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()方法。