2015-06-22 7 views
18

Ich habe ein C++ Programm, dieMemory Mapped-Datei in C++ in Java lesen

hMapFile = OpenFileMapping(dwDesiredAccess, bInheritHandle, lpName); 

Die lpName an einem Punkt verwendet, ist so etwas wie "myfile" ohne Erweiterungen oder Pfad, das heißt, eine Memory-Mapped-Datei. Ich kann die Datei mit dem WinObj -Browser (WinObj) im Pfad Sessions\1\BaseNamedObjects\myfile finden. Wenn ich versuche, diese bestimmte Datei in Java zu lesen, habe ich versucht,

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

Aber ich bekomme immer den gleichen Fehler: die angegebene Datei nicht am RandomAccessFile Befehl gefunden. Vielleicht wird ein anderer Dateizugriff benötigt? Welcher?

Wie ich von anderen Beiträgen zu verstehen, sie immer einen Weg benutzen und eine Verlängerung, aber ich habe keine Ahnung, dass der Pfad und Erweiterung in meinem Fall wäre ...

Was ich suche, ich eine Möglichkeit, das Kernel object namespaces Kernel-Objekt Namespaces

ich weiß, zugreifen zu können, gibt es dieses JNI Beispiel (Memorymap using JNI), jedoch würde ich mag es einfach zu halten und verwenden nio (wenn überhaupt möglich).

UPDATE

Also versuchte ich einfach die ganze Sache in C# und es war lächerlich einfach, hat mich nicht nehmen mehr als 5 Zeilen Code.

+1

Was ist das aktuelle Arbeitsverzeichnis des C++ Programms? Dort wird die Datei erstellt. Wenn Sie keinen absoluten Pfad angeben, wird der Dateiname im relativen Pfad des aktuellen Arbeitsverzeichnisses erstellt. Wenn die beiden Arbeitsverzeichnisse des C++ - und des Java-Programms nicht identisch sind, können Sie den relativen Pfad nicht wirklich verwenden. Sie sollten einen absoluten Pfad angeben, der in beiden Programmen identisch ist, um die Datei zu finden. –

+0

@ErwinBolwidt: Ja, es existiert, schrieb ich in der Frage, dass ich auf diese Datei zugreifen kann, während ich die Java-App im Winobj-Browser teste. @JoachimPileborg: Es ist so etwas wie 'C: \ Project \ server \ ', blöde Frage: Die Datei ist nicht sichtbar im' explorer', aber ich denke es sollte nicht? – rst

+1

Das Dateizuordnungsobjekt ist nicht Teil des Dateisystems. Arbeitsverzeichnis ist nicht relevant. Sie müssen auch 'OpenFileMapping' aufrufen. 'RandomAccessFile' wird das nicht tun. –

Antwort

-1

Sie müssen CreateFileMapping statt OpenFileMapping verwenden. Auf diese Weise erstellen Sie eine tatsächliche Datei auf der Festplatte, die der Dateizuordnung zugeordnet ist.

Hinweis: Es ist wichtig zu beachten, dass normale Schreib-/Lese-Methoden NICHT mit einer Dateizuordnung eines anderen Prozesses synchronisiert werden. So müssen Sie noch etwas wie MappedByteBuffer in Java verwenden

+0

Ich denke, Fragesteller möchte ein vorhandenes Mapping öffnen, eines erstellt von einem anderen Prozess –

+0

@DavidHeffernan: Ja. Das habe ich auch verstanden. CreateFileMapping erstellt ein neues OR, das eine vorhandene Dateizuordnung öffnet, die auf einer REAL-Datei basiert (anstelle von OpenFileMapping, die entweder ein vorhandenes Mapping öffnet oder ein neues erstellt, das NICHT auf einer echten Datei basiert.) – Daniel

+0

CreateFileMapping benötigt ein Datei-Handle. Es scheint mir, dass der Benutzer nicht in der Lage sein wird, dieses Datei-Handle zu erhalten. Also, OpenFileMapping ist, was benötigt wird. –

1

Eine Datei ist eine Datei, ich stimme mit "Joachim Pileborg" überein, dass das Java-Programm die Datei nicht in seinem Arbeitsverzeichnis hat. Versuchen Sie

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

und stellen Sie sicher, dass die Datei im richtigen Pfad ist.

+0

Hallo, das wird nicht funktionieren, überprüfen Sie "Non-persisted Memory-Mapped-Dateien" in https://msdn.microsoft.com/en-us/library/dd997372%28v=vs.110%29.aspx. Ich spreche von Shared Memory für IPC – rst