Java Channel解析与实例

来源:互联网 发布:唐朝 阿拉伯 知乎 编辑:程序博客网 时间:2024/06/05 00:42

文件IO

FileChannel是处理文件IO中的核心Channel实现。FileChannel不能直接构建,只能通过FileInputStream,FileOutputStream,RandomAccessFile通过getChannel()获得FileChannel实例对象,获得的FileChannel对象的权限也由相关的File对象所限制,也就说说FileInputStream所获得的Channel对象只能使用read(),如果使用write(),则会相关异常。

FileChannel是线程安全的,多个现在可以共享一个FileChannel实例并发调用read,write而不会产生多线程问题。

在操作系统层面,一个FileChannel与一个文件描述符一一对应。操作系统内核通过文件描述符来访问文件,文件描述符是一个非负整数,打开或创建文件的时候,系统内核会返回一个文件描述符,读写文件也时需要文件描述符来指定待读写的文件。

内存映射文件

FileChannel可以通过map()方法得到MappedByteBuffer,这个方法在一个打开文件和一个特殊类型的ByteBuffer之间建立一个虚拟内存映射。这个类有两个关键的API,load()将虚拟内存直接转载到物理内存中;force()将修改后的Buffer写入带磁盘中。

由于批量传输在IO中频繁的出现,以普通IO的方式惊醒批量传输性能又不高,所以FileChannel为批量传输提供了高效的API,transferTo和transferFrom,需要将一个通道交叉到另外一个通道并且不通过缓存区。

文件IO总时阻塞的,因此不能设于非阻塞模式下(磁盘特性造成)。对于文件IO,最大的意思是异步IO,他可以使得一个线程处理多个IO的时候,可以不必等待IO的完成,而是使用异步的模式,在完成之后回调事件中执行相关的逻辑,当然如果需要阻塞等待的时候,也可以在异步的模式中声明等待完成,可以使用异步的Future。在Java7中,AIO被纳入了NIO的范畴内,这里的NIO的N不是非阻塞的意思,而时新的意思,即新IO。