Отображение файловой памяти в Java бесполезно, если память должна быть скопирована в примитивы для последующей обработки - PullRequest
1 голос
/ 19 июня 2019

Я использую MappedByteBuffer для загрузки файла, который я записал в память. Это должен быть быстрый способ загрузки файла. Мой файл содержит кучу int с и double с. В Интернете есть множество учебных пособий, которые показывают, как написать, а затем прочитать файл. Это мой тест:

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 это невозможно.

Так что, по сути, я хотел бы получить доступ к отображенному в памяти файлу с произвольным доступом, а не с последовательным доступом.

Возможно, это недостаток использования MemoryMappedFiles в Java?

...