内存映射文件在 java 中读取C++

2022-09-02 22:41:53

我有一个C++程序,它一度使用

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);

它类似于没有扩展名或路径的东西,即内存映射文件。我可以在路径中找到带有WinObj浏览器(WinObj)的文件。如果我尝试在Java中读取该特定文件,我尝试了lpName"myfile"Sessions\1\BaseNamedObjects\myfile

File file = new File("myfile");
FileChannel filechannel = new RandomAccessFile(file, "r").getChannel();
MappedByteBuffer buffer = filechannel.map(FileChannel.MapMode.READ_ONLY, 0, filechannel.size());

但是我总是得到相同的错误:在命令中找不到指定的文件。也许需要另一个文件访问?哪一个?RandomAccessFile

正如我通过其他帖子所理解的那样,他们总是使用路径和扩展名,但是,我不知道路径和扩展名会在我的情况下......

我正在寻找什么,我一种访问内核对象命名空间的方法 内核对象命名空间

我知道,有这个JNI示例(使用JNI的Memorymap),但是我想保持简单和使用(如果可能的话)。nio

更新

所以我只是在C#中尝试了整个过程,这非常简单,没有超过5行代码。


答案 1

文件就是文件,我同意“Joachim Pileborg”的观点,即Java程序尚未在其工作目录中获取该文件。尝试

String working dir = System.getProperty("user.dir");

,并确保文件位于正确的路径中。


答案 2

您需要使用 代替 。这样,您将在磁盘上创建一个与文件映射关联的实际文件。CreateFileMappingOpenFileMapping

注意:请务必注意,使用常规读/写方法不会与其他进程的文件映射同步。所以你仍然需要在Java中使用类似MappedByteBuffer的东西。


推荐