我必须创建一个基于文件的通信协议(该文件是内存映射的,但我们现在可以从中抽象出来)。字节布局是固定的。有几个区域,功能不同。
通知'有一定的区域,例如。 G。字节#0直到字节#32k。每个字节都有两个值之一。让我们说 0x00 和 0xFF 。索引具有语义,因此如果字节#0 从0x00更新为0xFF,则表示与键0 关联的信息已更新。 对我来说有趣的是从0x00到0xFF的所有转换,反之亦然。
所以我的问题是:
是否存在高效,可能是本机,非轮询方法来检测某个区域中的文件更改(或上述转换)?
其他信息
虽然我已经将java指定为语言,但我愿意接受可以通过java调用的其他语言的解决方案(例如通过JNI的C ++)。
这是一个1对n协议,有1个主要应用程序,与最多n个其他人进行通信。因此,检查整个文件的更改并不是最佳选择。我也称之为不好,因为应用程序的使用方式主要是在给定的时间内可以假定为1比1,但这并非总是如此。
我还被告知只使用1个文件。
答案 0 :(得分:1)
是,或至少,差不多:请使用java.nio.file.WatchService
。
FileSystem filesystem = FileSystems.getDefault();
WatchService watcher = filesystem.newWatchService();
此后,您可以使用此观察程序注册观看事件。
Path dir = fileSystem.getPath("/tmp/file");
dir.register(watcher, StandardWatchEventKind.ENTRY_MODIFY);
这不会告诉您文件的特定区域是否发生了变化,但会在有某种变化时通知您。我认为这是你得到的最好的。
如果这还不够好,你可以将文件分成两部分:一个标题(你看的标题)和一个标题(你不会)。