2

我正在使用 MappedByteBuffer 将我写入的文件加载到内存中。这应该是加载文件的一种快速方法。我的文件包含一堆ints 和doubles。网上有很多教程向您展示如何编写然后读取文件。这是我的测试:

private static int count = (500*4) + (500*8);

public static void main(String[] args) throws IOException {
    //writing two arrays to file
    int[] a = new int[500];
    double [] b = new double[500];

    for (int i = 0; i < a.length; i++){
        a[i] = i;
        b[i] = (double)i;
    }

    RandomAccessFile memoryMappedFile = new RandomAccessFile("f.txt","rw");
    MappedByteBuffer out = memoryMappedFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, count);
    for(int i = 0 ; i < a.length; i++) {
        out.putInt(a[i]);
        out.putDouble(b[i]);
    }

    //reading back the ints and doubles
    int c = 0;
    out.position(c);
    while (out.hasRemaining()){
        System.out.println(out.getInt(c));
        c += 4;
        out.position(c);
        System.out.println(out.getDouble(c));
        c += 8;
        out.position(c);

    }
}

这一切都很好,但是这些教程的问题是它们只是将文件的内容打印到控制台。但是,如果我想使用文件的值进行更多计算,稍后,我需要将它们存储到一些变量(或数组)中,本质上是制作它们的新副本,这违背了内存映射文件的目的。

唯一的其他解决方法是按需调用out.position(),但我需要知道我想要使用的期望值在哪个位置,我认为如果我不按顺序遍历它们是不可能知道的。

在 c/c++ 中,您可以创建一个 int 变量,该变量将指向内存映射的 int,因此您不会复制该值,但在 Java 中,这是不可能的。

所以本质上我想以随机访问而不是顺序访问内存映射文件。

这可能是在 java 中使用 MemoryMappedFiles 的一个缺点吗?

4

0 回答 0