Почему не работает метод array () MappedByteBuffer?

Я новичок в Java и пытаюсь использовать интерфейс Java Mathematica для доступа к файлу с использованием отображения памяти (в надежде на улучшение производительности).

Имеющийся у меня код Mathematica (я считаю) эквивалентен следующему коду Java (на основе this ):

import java.io.FileInputStream;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class MainClass {
  private static final int LENGTH = 8*100;

  public static void main(String[] args) throws Exception {
    MappedByteBuffer buffer = new FileInputStream("test.bin").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, LENGTH);
    buffer.load();
    buffer.isLoaded(); // returns false, why?
  }
}

Я хотел бы использовать метод array () в буфере, поэтому я сначала пытаюсь загрузить содержимое буфера в память, используя load () . Однако даже после load () , isLoaded () возвращает false , а buffer.array () выдает исключение: java.lang.UnsupportedOperationException в java.nio.ByteBuffer.array (ByteBuffer.java:940) .

Почему не загружается буфер и как я могу вызвать метод array () ?

Моя конечная цель - получить массив double с помощью asDoubleBuffer (). Array () .Метод getDouble () действительно работает правильно, но я надеялся сделать это за один раз для хорошей производительности. Что я делаю не так?


Поскольку я делаю это из Mathematica, я опубликую фактический код Mathematica, который я тоже использовал (эквивалент приведенного выше в Java):

Needs["JLink`"]
LoadJavaClass["java.nio.channels.FileChannel$MapMode"]
buffer = JavaNew["java.io.FileInputStream", "test.bin"]@getChannel[]@map[FileChannel$MapMode`READUONLY, 0, 8*100]

buffer@load[]
buffer@isLoaded[] (* returns False *)

10
задан Szabolcs 29 January 2018 в 07:33
поделиться