有几个高质量的框架隐藏了基于 NIO 的网络编程的复杂性(mina、netty、grizzly 等)。是否有类似的框架可以简化基于 NIO 的文件系统编程?
例如,作为一个学习练习,我想根据这篇(真棒!)文章实现一个磁盘支持的地图:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 .html _
有几个高质量的框架隐藏了基于 NIO 的网络编程的复杂性(mina、netty、grizzly 等)。是否有类似的框架可以简化基于 NIO 的文件系统编程?
例如,作为一个学习练习,我想根据这篇(真棒!)文章实现一个磁盘支持的地图:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 .html _
但那是因为 Java 的 NIO FileChannel和MappedByteBuffer不像网络和Selector的东西那样复杂或难以理解和使用java.nio
。
以下是创建适合您练习的磁盘支持映射(在 NIO-land 中称为“映射字节缓冲区”)的示例:
File file = new File("/Users/stu/mybigfile.bin");
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_WRITE, 0, file.length());
您可以像访问任何其他Buffer一样访问缓冲区。数据在磁盘和内存之间神奇而快速地移动,所有这些都由 Java 和底层操作系统的虚拟内存管理系统管理。不过,您确实对此有一定程度的控制。例如:MappedByteBuffer's .force()
( '强制将此缓冲区内容所做的任何更改写入包含映射文件的存储设备。' ) 和.load()
( '将此缓冲区的内容加载到物理内存中。' ) 我个人从来不需要这些。
添加到@Stu 的评论。值得注意的是,套接字连接不会一次获得所有数据,而是可能需要支持许多慢速连接(尤其是打开但尚未发送数据的连接)
但是对于文件,所有数据一次可用,您通常只需一次打开几个文件即可获得最佳性能(通常一次一个就可以了)如果您从多个驱动器(罕见)或从多个服务器(非常罕见)或多个网络接口(更罕见)一次访问几个文件可能会提高性能。即使这样,复杂性也不高,您只需为要加载的每个文件创建一个线程。
文件复杂的唯一场合是读取日志文件。这很复杂,因为文件在您阅读时会变大。您可以到达文件的末尾并稍后找到更多数据。日志文件也可以旋转,这意味着您打开的文件不再是您想要的文件。即便如此,这也不是很难处理,而且是相当罕见的要求。