📜  什么是Java的内存映射文件?

📅  最后修改于: 2022-05-13 01:54:42.835000             🧑  作者: Mango

什么是Java的内存映射文件?

内存映射文件是Java中的临时特殊文件,有助于直接从内存访问内容。 Java Programming 支持带有Java.nio 包的内存映射文件。内存映射 I/O 使用文件系统建立从用户直接到文件系统页面的虚拟内存映射。它可以简单地视为一个大数组。用于加载内存映射文件的内存在Java堆空间之外。

这里我们使用 MappedByteBuffer 来读写内存。此实用程序可用于创建和存储高效的内存映射文件。 MappedByteBuffer 的一些主要重要特性如下:

  1. MappedByteBuffer 和文件映射在垃圾被收集之前保持有效。 sun.misc.Cleaner可能是唯一可用于清除内存映射文件的选项。
  2. 内存映射文件的读写一般由操作系统完成,将内容写入磁盘。
  3. 首选直接缓冲区而不是间接缓冲区以获得更好的性能。
  4. 用于加载文件的内存在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编程语言直接访问它。