Java 有效地检测文件特定字节间隔中的更改
我必须创建一个基于文件的通信协议(该文件是内存映射的,但我们现在可以从中提取)。字节布局是固定的。有几个区域,它们具有不同的功能 有一个特定的“通知”区域,例如。G字节0到字节32k。每个字节有两个值中的一个。假设0x00和0xFF。索引具有语义,因此如果字节#0get从0x00更新到0xFF,则表示与键0相关的信息已更新。 我感兴趣的是从0x00到0xFF的所有转换,反之亦然 所以我的问题是: 是否有一种有效的,可能是本地的,非轮询方法来检测特定区域中的文件更改(以及上述转换)Java 有效地检测文件特定字节间隔中的更改,java,shared-memory,Java,Shared Memory,我必须创建一个基于文件的通信协议(该文件是内存映射的,但我们现在可以从中提取)。字节布局是固定的。有几个区域,它们具有不同的功能 有一个特定的“通知”区域,例如。G字节0到字节32k。每个字节有两个值中的一个。假设0x00和0xFF。索引具有语义,因此如果字节#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是你的答案。我更新了附加信息。问题是监视整个文件可能不够好。维护多个文件会更容易是的,但我必须使用一个。我不确定我是否能改变这条规则。