java中的java.nio内存映射文件,用于读取大文件

时间:2014-03-30 06:53:10

标签: nio memory-mapped-files

任何人都可以向我解释以下代码的内部工作

public class MemoryMappedFileInJava {

private static int count = 10485760; //10 MB

public static void main(String[] args) throws Exception {

    RandomAccessFile memoryMappedFile = new RandomAccessFile("largeFile.txt", "rw");

    //Mapping a file into memory

    MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);

    //Writing into Memory Mapped File
    for (int i = 0; i < count; i++) {
        out.put((byte) 'A');
    }

    System.out.println("Writing to Memory Mapped File is completed");



    //reading from memory file in Java
    for (int i = 0; i < 10 ; i++) {
        System.out.print((char) out.get(i));
    }

    System.out.println("Reading from Memory Mapped File is completed");

}

}

我还没有理解文件

1)什么是MappedByteBuffer意味着它内部如何工作?

2)文件通道是什么处理文件需要执行的操作,即读或写?

3)map()方法它实际映射的是什么?

4)这种方法比使用java.io文件读写更快?

5)这种方法是否有用,只有当我说我的堆大小为400MB并且我需要读取8GB的文件时。或者我可以随时使用它?

6)在上面的代码中读写是逐字节的,怎么可以快速解释一下?

1 个答案:

答案 0 :(得分:3)

  

什么是MappedByteBuffer意味着它内部如何运作?

它是操作系统分配的内存区域的Java包装器,通常在分页的基础上映射到文件。因此,内存区域似乎包含文件的内容,对它的更改将被写回文件。

  

什么是文件通道是否处理需要执行读取或写入操作的文件?

  

map()方法它实际映射的是什么?

文件到内存,或文件的内存,无论你喜欢它的哪种方式。

  

这种方法如何比使用java.io文件读写更快?

它绕过了很多操作系统文件系统。

  

这种方法是否有用,只有当我说我的堆大小为400MB并且我需要读取8GB的文件时。或者我可以随时使用它?

您可以在限制范围内随时使用它,但它实际上只对大文件有益。上次测量时,性能增益仅为20%左右。

  

在上面的代码中,读取和写入是逐字节的,如何快速解释?

因为分页。

相关问题