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