Ich kann lesen/schreiben ein Linux-Block-Gerät mit Java mit java.nio
. Der folgende Code funktioniert:Wie Speicherabbild (mmap) ein Linux-Block-Gerät (z. B./dev/sdb) in Java?
Path fp = FileSystems.getDefault().getPath("/dev", "sdb");
FileChannel fc = null;
try {
fc = FileChannel.open(fp, EnumSet.of(StandardOpenOption.READ, StandardOpenOption.WRITE));
} catch (Exception e) {
System.out.println("Error opening file: " + e.getMessage());
}
ByteBuffer buf = ByteBuffer.allocate(50);
try {
if(fc != null)
fc.write(buf);
} catch (Exception e) {
System.out.println("Error writing to file: " + e.getMessage());
}
Speicherzuordnung funktioniert jedoch nicht. Der folgende Code nicht:
MappedByteBuffer mbb = null;
try {
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 100);
} catch (IOException e) {
System.out.println("Error mapping file: " + e.getMessage());
}
Dieses mit Fehler fehlschlägt:
java.io.IOException: Invalid argument
at sun.nio.ch.FileDispatcherImpl.truncate0(Native Method)
at sun.nio.ch.FileDispatcherImpl.truncate(FileDispatcherImpl.java:79)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:817)
Gibt es eine Arbeit um zu diesem? Vielleicht mit einer anderen Bibliothek? Ich habe irgendwo gelesen, dass ich das vielleicht mit JNI machen könnte, aber ich konnte keine Quellen finden.
Ist das Ihr richtiger Code? Sicher wird truncate() nur im schreibgeschützten Modus aufgerufen? – EJP