Java 有效地检测文件特定字节间隔中的更改

Java 有效地检测文件特定字节间隔中的更改,java,shared-memory,Java,Shared Memory,我必须创建一个基于文件的通信协议(该文件是内存映射的,但我们现在可以从中提取)。字节布局是固定的。有几个区域,它们具有不同的功能 有一个特定的“通知”区域,例如。G字节0到字节32k。每个字节有两个值中的一个。假设0x00和0xFF。索引具有语义,因此如果字节#0get从0x00更新到0xFF,则表示与键0相关的信息已更新。 我感兴趣的是从0x00到0xFF的所有转换,反之亦然 所以我的问题是: 是否有一种有效的,可能是本地的,非轮询方法来检测特定区域中的文件更改(以及上述转换) 其他信息 虽

我必须创建一个基于文件的通信协议(该文件是内存映射的,但我们现在可以从中提取)。字节布局是固定的。有几个区域,它们具有不同的功能

有一个特定的“通知”区域,例如。G字节0到字节32k。每个字节有两个值中的一个。假设0x000xFF。索引具有语义,因此如果字节#0get从0x00更新到0xFF,则表示与键0相关的信息已更新。 我感兴趣的是从0x00到0xFF的所有转换,反之亦然

所以我的问题是:

是否有一种有效的,可能是本地的,非轮询方法来检测特定区域中的文件更改(以及上述转换)


其他信息

<>虽然我已经指定java为语言,但我愿意接受其他语言的解决方案,这些语言可以通过java调用(例如C++通过JNI)。 这是一个1对n协议,有一个主应用程序,可以与多达n个其他应用程序进行通信。因此,检查整个文件的更改并不是最佳选择。我也不能说它不好,因为应用程序的使用方式主要是在给定的时间内假设1对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);
这不会告诉您文件的特定区域是否已更改,但会在发生某种更改时通知您。我想这是你能得到的最好的了


如果这还不够好,您可以将文件分为两部分:头(您可以查看)和正文(您不可以查看).

您还需要决定是否希望它是跨平台的。我不确定文件中的特定区域是否有解决方案,但您可以侦听任何文件更改,然后轮询特定字节并进行检查。@chiatic security是的,您是对的。其实是跨平台的。但是java现在已经足够了。Thx是你的答案。我更新了附加信息。问题是监视整个文件可能不够好。维护多个文件会更容易是的,但我必须使用一个。我不确定我是否能改变这条规则。