Я новичок в 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 *)