gpt4 book ai didi

java - 如何在 Java 中内存映射(mmap)一个 linux block 设备(例如/dev/sdb)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:25:40 26 4
gpt4 key购买 nike

我可以使用 java.nio 使用 Java 读/写 linux block 设备。以下代码有效:

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());
}

但是,内存映射不起作用。以下代码失败:

MappedByteBuffer mbb = null;
try {
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 100);
} catch (IOException e) {
System.out.println("Error mapping file: " + e.getMessage());
}

失败并出现错误:

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)

有解决办法吗?也许通过使用不同的库?我在某处读到,也许通过使用 JNI 我可以做到这一点,但我找不到任何来源。

最佳答案

根据documentation实际映射文件的机制留给实现。该实现似乎正在尝试截断文件(可能是因为 block 设备大小与您指定的大小不同?)。

我很好奇你为什么要直接从 block 设备读取(除非你正在尝试编写某种文件系统实用程序或需要执行原始 I/O 的东西)。如果您需要直接从 block 设备读取内存映射文件,您可能需要编写一些 C/C++ 代码来映射文件并处理读/写,并使用 Java/JNI 桥接类来桥接对您的调用C/C++ 代码。这样你就可以自己处理调用 mmap() 并可以指定你需要的任何选项。看着 mmap() documentation您可能无法在您的平台上指定 block 设备(我猜是 Linux,但我可能是错的)。

如果您绝对需要在 Java 中执行此操作,您可能需要执行适当长度和偏移量的 read() 调用和 write() 调用。

关于java - 如何在 Java 中内存映射(mmap)一个 linux block 设备(例如/dev/sdb)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15901832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com