Java 来自 Windows 系统的内存映射文件
Java memory Mapped File from Windows system
我正在尝试新的东西,
有一个应用程序将数据发送到位于 Local\MemFileName
的内存映射文件
我想在java,
阅读
我尝试了一些教程,例如 https://www.baeldung.com/java-mapped-byte-buffer, https://howtodoinjava.com/java7/nio/memory-mapped-files-mappedbytebuffer/
但是好像都是在JVM中读取一个文件,还是没看懂...
如何读取位于 windows 系统 Local\MemFileName
中的文件内容
谢谢!
以下:我尝试过的示例代码
public class Main {
private static final String IRSDKMEM_MAP_FILE_NAME = StringEscapeUtils.unescapeJava("Local\IRSDKMemMapFileName");
private static final String IRSDKDATA_VALID_EVENT = StringEscapeUtils.unescapeJava("Local\IRSDKDataValidEvent");
public static final CharSequence charSequence = "Local\IRSDKMemMapFileName";
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println(charSequence);
try (RandomAccessFile file = new RandomAccessFile(new File(IRSDKMEM_MAP_FILE_NAME), "r")) {
//Get file channel in read-only mode
FileChannel fileChannel = file.getChannel();
//Get direct byte buffer access using channel.map() operation
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
// the buffer now reads the file as if it were loaded in memory.
System.out.println("Loaded " + buffer.isLoaded()); //prints false
System.out.println("capacity" + buffer.capacity()); //Get the size based on content size of file
//You can read the file from this buffer the way you like.
for (int i = 0; i < buffer.limit(); i++) {
System.out.println((char) buffer.get()); //Print the content of file
}
}
}
}
读取内存映射文件:
使用 FileChannel.open
在文件上打开一个 FileChannel
。
调用 FileChannel
上的 map
方法创建一个 MappedByteBuffer
覆盖您要读取的文件区域。
从MappedByteBuffer
读取数据。
我的解决方案是使用 JNA 库中的 WindowsService.class 实现方法,如您所见:
My Library
有了这个我可以打开映射到 Windows 系统的文件。
对于可从 JVM 访问的文件,之前的所有答案都是正确的,但从 JVM 外部这是不可能的。
谢谢!
我正在尝试新的东西, 有一个应用程序将数据发送到位于 Local\MemFileName
的内存映射文件我想在java,
阅读我尝试了一些教程,例如 https://www.baeldung.com/java-mapped-byte-buffer, https://howtodoinjava.com/java7/nio/memory-mapped-files-mappedbytebuffer/
但是好像都是在JVM中读取一个文件,还是没看懂...
如何读取位于 windows 系统 Local\MemFileName
中的文件内容谢谢!
以下:我尝试过的示例代码
public class Main {
private static final String IRSDKMEM_MAP_FILE_NAME = StringEscapeUtils.unescapeJava("Local\IRSDKMemMapFileName");
private static final String IRSDKDATA_VALID_EVENT = StringEscapeUtils.unescapeJava("Local\IRSDKDataValidEvent");
public static final CharSequence charSequence = "Local\IRSDKMemMapFileName";
public static void main(String[] args) throws IOException, InterruptedException {
System.out.println(charSequence);
try (RandomAccessFile file = new RandomAccessFile(new File(IRSDKMEM_MAP_FILE_NAME), "r")) {
//Get file channel in read-only mode
FileChannel fileChannel = file.getChannel();
//Get direct byte buffer access using channel.map() operation
MappedByteBuffer buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileChannel.size());
// the buffer now reads the file as if it were loaded in memory.
System.out.println("Loaded " + buffer.isLoaded()); //prints false
System.out.println("capacity" + buffer.capacity()); //Get the size based on content size of file
//You can read the file from this buffer the way you like.
for (int i = 0; i < buffer.limit(); i++) {
System.out.println((char) buffer.get()); //Print the content of file
}
}
}
}
读取内存映射文件:
使用 FileChannel.open
在文件上打开一个 FileChannel
。
调用 FileChannel
上的 map
方法创建一个 MappedByteBuffer
覆盖您要读取的文件区域。
从MappedByteBuffer
读取数据。
我的解决方案是使用 JNA 库中的 WindowsService.class 实现方法,如您所见: My Library
有了这个我可以打开映射到 Windows 系统的文件。
对于可从 JVM 访问的文件,之前的所有答案都是正确的,但从 JVM 外部这是不可能的。
谢谢!