Posso leggere/scrivere un dispositivo a blocchi Linux con Java usando java.nio
. Il seguente codice funziona:Come memorizzare la mappa (mmap) un dispositivo di blocco linux (ad esempio/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());
}
Tuttavia, la mappatura della memoria non funziona. Il seguente codice fallisce:
MappedByteBuffer mbb = null;
try {
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 100);
} catch (IOException e) {
System.out.println("Error mapping file: " + e.getMessage());
}
Ciò non è riuscito con errore:
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)
C'è un lavoro intorno a questo? Forse utilizzando una libreria diversa? Ho letto da qualche parte che forse usando JNI potrei farlo, ma non ho trovato alcuna fonte.
È il tuo vero codice? Sicuramente truncate() viene chiamato solo in modalità di sola scrittura? – EJP