Java NIO之FileChannel学习

来源:互联网 发布:淘宝网品牌特卖会 编辑:程序博客网 时间:2024/06/04 22:58

1.FileChannel是一个关于读,写,映射或者操作一个文件的通道

2.一个FileChannel是一个SeekableChannel,它和一个文件连接。在它的文件里有有一个当前位置(position),这个位置可以查询,也可以修改。这个文件它本身包含一个可变长度的字节序列可以用来读或者写,它当前的size也可以查询。文件的大小会随着写入的byte数量超过它本上的大小时而增加,文件的大小会减小当它被缩减的时候(truncated)。这个文件可能也有一些元数据,例如访问权限,文件类型和最后一次修改时间。FileChannel这个类中没有定义关于元数据的方法。

3.除了熟悉的关于字节的读,写,关闭操作外,这个类定义了以下关于文件具体的操作。

1)字节可以在在一个文件的一个绝对的位置读或者写,在某种程度上不会影响通道当前的位置(read/write)

2)文件的一个区域可以直接映射在内存中,对于一个大文件这是一个十分高效的方法相对于调用普通的read,write方法而言。(map)

3)更新使一个文件强制输出到底层的存储设备,确保数据在系统的缓存中没有丢失。(force)

4)字节可以从一个文件转移到其他通道,反之亦然。在某种程度上,可以被最佳化的通过许多操作系统里一个非常快的直接转移到或者从文件系统的缓存中。(transferTo)

5)一个文件的部分可以阻止其他程序的访问。(FileLock)

4.FileChannel在大量并非的线程中是线程安全的,它的close方法可能在任何时候被调用和Channel接口中声明的一样。在指定的时间内,只有一个操作可以调用channel的position方法或者在程序内改变文件的大小。当第一个操作仍在程序中执行时尝试去初始化第二个这样的操作会一直被阻塞直到第一个程序执行完毕。其他的操作,在特殊情况下,它们拿到一个明确的位置,可能会同时进行,实际上它们是否那样做取决于底层的实现,因此未指定。

4.一个文件的视图由FileChannel的一个实例提供和同一个文件的其他视图通过其他实例提供在同一个程序中保证了一致性。一个视图可能或者不可能通过FileChannel的一个实例提供,然而,与其他并发运行的程序看到的视图一致由于底层的操作系统执行缓存和网络文件系统协议产生的延迟。不管这些程序是用什么语言编写的,它们是在同一台机器上运行还是在其他机器上运行,这都是真的。这种不一致的确切性质是系统依赖的,因此是未指定的。

5.FileChannel的创建方式

FileChannel.open();

FileInputStream.getChannel();    读

FileOutputStream.getChannel(); 写

RandomAccessFile.getChannel(); 指定读写模式(MapMode,r读,rw可以读也可以写)


原创粉丝点击