有几个高质量的框架隐藏了基于NIO的网络编程(Mina,Netty,Grizzly等)的复杂性。是否有类似的框架来简化基于NIO的文件系统编程?

例如,作为一项学习练习,我想根据此(真棒!)文章实现磁盘支持的地图: http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.html.

有帮助吗?

解决方案

不是,但...)

但这是因为Java的Nio FilechannelMapapedByteBuffer 不像网络那样复杂或难以理解和使用 选择器 东西 java.nio.

这是创建磁盘支持的地图(在Nio-Land中称为“映射的Byte Buffer”)的一个示例,适合您的锻炼:

File file = new File("/Users/stu/mybigfile.bin");
FileChannel fc = (new FileInputStream(file)).getChannel(); 
MappedByteBuffer buf = fc.map(MapMode.READ_WRITE, 0, file.length());

您可以像其他任何人一样访问缓冲区 缓冲. 。数据在磁盘和内存之间神奇地移动,所有这些都由Java和基础OS的虚拟内存管理系统管理。但是,您确实对此有一定程度的控制。例如:mappedbytebuffer的 .force() (“强制对此缓冲区内容进行的任何更改都写入包含映射文件的存储设备。”) 和 .load() (“将缓冲区的内容加载到物理内存中。”)我从不亲自需要这些。

其他提示

添加到 @Stu的评论中。值得注意的是,插座连接并非一次拥有所有数据,而是需要支持许多慢速连接(ESP连接开放但尚未发送数据)

但是,对于文件,所有数据都可以一次可用,通常只需要一次打开几个文件即可获得最高性能(通常是一个可以一次性的性能),如果您是从多个驱动器(稀有)或从多个服务器(非常罕见)或多个网络接口(甚至更稀有),您可能会一次访问一些文件可以改善性能。即使那样,复杂性也不高,您只需为要加载的每个文件创建一个线程即可。

文件复杂的唯一场合是读取日志文件。这很复杂,因为该文件在阅读时可能会增加。您可以到达文件的末尾,然后找到更多数据。另外,日志文件可以旋转,这意味着您打开的文件不再是您想要的文件。即使如此,这也不是很难处理,而且是相当罕见的要求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top