【问题标题】:Efficiently detect changes in specific byte interval of file有效检测文件特定字节间隔的变化
【发布时间】:2014-11-11 16:55:07
【问题描述】:

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

“通知”有一定的区域,例如。 G。字节# 0 到字节# 32k。每个字节具有两个值之一。假设 0x000xFF。索引具有语义,因此如果 byte# 0 从 0x00 更新到 0xFF,则意味着与 key 0 关联的信息已更新。 对我来说有趣的是从 0x00 到 0xFF 的所有转换,反之亦然。

所以我的问题是:

是否有一种高效,可能是原生的非轮询方法来检测特定区域中的文件更改(分别是上述转换)?


其他信息

虽然我已将 java 指定为语言,但我愿意接受可以通过 java 调用的其他语言的解决方案(例如通过 JNI 调用的 C++)。

这是一个 1 对 n 协议,有 1 个主应用程序,最多可与 n 个其他应用程序通信。因此,检查整个文件是否有更改并不是最佳选择。我也不能说它不好,因为该应用程序的主要使用方式是在给定时间假设一对一,但情况并非总是如此。

我还被告知只能使用 1 个文件。

【问题讨论】:

  • 您还需要决定是否希望它是跨平台的。
  • 我不确定文件中的特定区域是否有解决方案,但您可以监听任何文件更改,然后轮询特定字节并检查这些。
  • @chiastic-security 是的,你是对的。实际上它是跨平台的。但是java现在就足够了。

标签: java shared-memory


【解决方案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);

这不会告诉您文件的特定区域是否发生了变化,但会在发生某种变化时通知您。我想这是你能得到的最好的。

如果这还不够好,您可以将文件分成两部分:标题(您可以观看)和正文(您不观看)。

【讨论】:

  • 感谢您的回答。我更新了附加信息。问题是观看整个文件可能还不够好。维护多个文件会更容易,是的,但我必须使用一个。我不确定我是否可以改变这条规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2014-03-13
相关资源
最近更新 更多