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