Tôi có thể đọc/ghi thiết bị khối linux bằng Java sử dụng java.nio
. Mã sau đây hoạt động:Làm thế nào để bộ nhớ bản đồ (mmap) một thiết bị khối linux (ví dụ/dev/sdb) trong 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());
}
Tuy nhiên, ánh xạ bộ nhớ không hoạt động. Các mã sau không:
MappedByteBuffer mbb = null;
try {
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 100);
} catch (IOException e) {
System.out.println("Error mapping file: " + e.getMessage());
}
này không thành công với Lỗi:
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ó một công việc xung quanh để điều này? Có lẽ bằng cách sử dụng một thư viện khác? Tôi đọc ở đâu đó có thể bằng cách sử dụng JNI tôi có thể làm điều này, nhưng tôi không thể tìm thấy bất kỳ nguồn nào.
Đó có phải là mã thực sự của bạn không? Chắc chắn truncate() chỉ được gọi trong chế độ chỉ ghi? – EJP