什么是Java的内存映射文件?
内存映射文件是Java中的临时特殊文件,有助于直接从内存访问内容。 Java Programming 支持带有Java.nio 包的内存映射文件。内存映射 I/O 使用文件系统建立从用户直接到文件系统页面的虚拟内存映射。它可以简单地视为一个大数组。用于加载内存映射文件的内存在Java堆空间之外。
这里我们使用 MappedByteBuffer 来读写内存。此实用程序可用于创建和存储高效的内存映射文件。 MappedByteBuffer 的一些主要重要特性如下:
- MappedByteBuffer 和文件映射在垃圾被收集之前保持有效。 sun.misc.Cleaner可能是唯一可用于清除内存映射文件的选项。
- 内存映射文件的读写一般由操作系统完成,将内容写入磁盘。
- 首选直接缓冲区而不是间接缓冲区以获得更好的性能。
- 用于加载文件的内存在Java堆之外并驻留在共享内存中,这允许我们以两种不同的方式访问 文件。顺便说一下,这取决于您使用的是直接缓冲区还是间接缓冲区。
在总结内存映射文件的优点和缺点之前,让我们进行翻转和实现相同的
例子:
Java
// Java Program to illustrate Memory Mapped File via
// RandomAccessFile to open a file using FileChannel's map()
// method
// Importing standard classes from respective packages
import java.io.*;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.Scanner;
// Main class
public class GFG {
// The next line shows 10 MB as the max value of the
// count
private static int count = 10485760;
// Main driver method
public static void main(String[] args) throws Exception
{
// Display message asking user to enter the input
// string
System.out.print("enter character or string");
// The method RandomAccessFile has an object sc and
// is used to create a text file
// Try block to check for exceptions
try (RandomAccessFile sc
= new RandomAccessFile("text.txt", "rw")) {
// Scanner class to take objects input
// Taking String a as input
Scanner s = new Scanner(System.in);
String a;
a = s.next();
// Mapping the file with the memory
// Here the out is the object
// This command will help us enable the read and
// write functions
MappedByteBuffer out = sc.getChannel().map(
FileChannel.MapMode.READ_WRITE, 0, 10);
// Writing into memory mapped file
// taking it as 10 and printing it accordingly
for (int i = 0; i < 10; i++) {
System.out.println((out.put((byte)i)));
}
// Print the display message as soon
// as the memory is done writing
System.out.println(
"Writing to Memory is complete");
// Reading from memory mapped files
// You can increase the size , it not be 10 , it
// can be higher or lower Depeding on the size
// of the file
for (int i = 0; i < 10; i++) {
System.out.println((char)out.get(i));
}
// Display message on the console showcasing
// successful execution of the program
System.out.println(
"Reading from Memory is complete");
}
}
}
输出:
到目前为止,我们已经研究了我们使用内存映射文件的内容和原因,也已经看到了实现。但有了这些优点,也有缺点,如下所示:
内存映射文件的优点如下:
- 性能:内存映射文件比标准文件快得多。
- 共享延迟:文件可以共享,为您提供进程之间的共享内存,并且延迟比使用 Socket over loopback 低 10 倍。
- 大文件:它允许我们展示其他方式无法访问的较大文件。它们更快更干净。
内存映射文件的缺点如下:
- 故障: 内存映射文件的缺点之一是随着内存的不断增加,页面错误的数量也会增加。由于只有一小部分进入内存,因此您可能请求的页面在内存中不可用时可能会导致页面错误。但值得庆幸的是,大多数操作系统通常可以映射所有内存并使用Java编程语言直接访问它。