C ++中的内存映射文件用Java读取

时间:2015-06-22 07:21:04

标签: java c++ winapi nio memory-mapped-files

我有一个在某一时刻使用的C ++程序

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName);

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

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

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

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

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

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

更新

所以我只是尝试了C#中的所有内容,这非常容易,并没有带我超过5行代码。

2 个答案:

答案 0 :(得分:1)

文件是文件,我同意" Joachim Pileborg" Java程序没有在其工作目录中获取该文件。试试

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

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

答案 1 :(得分:0)

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

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