【问题标题】:Java Memory-mapped files?Java 内存映射文件?
【发布时间】:2011-05-14 18:43:03
【问题描述】:

Java 中的内存映射文件是否类似于 Windows 中的内存映射文件?还是仅仅基于Java中的内存和文件常用操作进行仿真?

【问题讨论】:

    标签: java winapi memory-mapped-files


    【解决方案1】:

    它使用操作系统对内存映射文件的支持。

    我正在尝试查找文档来支持它,但我还没有找到任何结论性的东西。然而,文档的各个部分确实这样说:

    内存映射文件的许多细节本质上依赖于底层操作系统,因此未指定。当请求的区域未完全包含在此通道的文件中时,此方法的行为未指定。未指定此程序或其他程序对基础文件的内容或大小所做的更改是否传播到缓冲区。未指定缓冲区更改传播到文件的速率。

    如果一切都只是模拟,就不需要这种未指定的行为。

    【讨论】:

    • 谢谢@Jon 的回答!据我了解:java.nio 类(用于操作内存映射文件)包装 Windows API 内存映射文件函数?我说的对吗?)))
    • 我试着做一些测试。我想创建一个 MMF 并在两个进程之间共享它:Win32 C++ 和带有 nio 的 Java。但是测试失败了,因为我发现我无法在 Java 中创建/打开“命名”MMF。大声笑)))
    【解决方案2】:

    在您的问题和评论的字里行间,您要做的是使用内存映射文件在 Java 和 C++ 应用程序之间共享内存/对象。

    我的建议是不要尝试这样做

    需要解决一些难题才能使其可靠:

    • 同步两个应用程序对共享数据结构的使用,
    • 确保一个应用程序所做的更改可靠地写入主内存并由另一个应用程序读取,
    • 确保更改按预期顺序刷新到磁盘。

    Java 特有的问题是您不能将 Java 对象放在内存映射区域中。相反,您必须以某种与 C++ 端所期望的表示兼容的方式对它们进行序列化和反序列化。

    最后,即使您确实成功解决了所有这些问题,您的解决方案也可能很脆弱,因为它取决于操作系统、C++ 和 Java 实现的未指定行为可能会改变,如果您更改上述任何版本的版本。

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 1970-01-01
      • 2010-11-04
      • 2011-02-04
      • 2014-11-16
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多