AsynchronousFileChannel

来源:互联网 发布:最优化算法例题 编辑:程序博客网 时间:2024/06/15 06:47
一个读,写操作文件的异步通道。

当通过此类定义的一个打开方法打开一个文件时将生成一个异步文件通道。
该文件包含可读取和可写入的可变长度序列,并且可以查询当前长度大小。
当写入字节的长度超过当前大小字节的长度会随之增加;当文件被截断时,文件的大小会减小。。

异步文件通道在文件中没有当前位置。 而是将文件位置指定给启动异步操作的每个读写方法。 一个CompletionHandler被指定为一个参数,并被调用以消耗I / O操作的结果。 此类还定义了启动异步操作的读取和写入方法,返回未来以表示操作的待处理结果。 未来可能用于检查操作是否已经完成,等待完成,并检索结果。

除了读写操作外,这个类还定义了如下的操作:
对文件的更新可能被强制退出到底层存贮设备,确保在系统崩溃时数据不会丢失。
文件的区域可以被锁定以防其他程序的访问。

一个异步文件通道是和一个线程池相关联的,这个线程池会处理I/O事件以及把这些事件分发给
completion handlers,这些handlers会消费这个通道上I/O的结果。在通道上启动的I / O操作的完成处理程序保证由线程池中的一个线程调用(这样可以确保完成处理程序由具有预期标识的线程运行)。当一个io操作立即完成,而且启动的线程本身是线程中的线程,则完成处理程序可以直接由启动线程调用。当创建异步文件通道没有指定线程时程序会分配默认的线程池,默认线程池有可能会被多个通道共享。默认线程池的配置由AsynchronousChannelGroup类来定义。。

此类型的通道被多个并发线程使用时是安全的。close方法可以随时被调用,由Channel接口指定。close使用不当会导致这个通道上所有未完成的异步操作会AsynchronousCloseException.来完成。多个读操作和写操作可能同时出现。当多个读写操作都未完成时,它们就会排队,但是被调用的completion handler的顺序没有被指定。他们不会被保证按照操作开始的顺序执行。ByteBuffers用于当并发io操作不安全时。此外,当一个io操作启动之后要当心确保这个操作不会再完成之前去访问buffer。