ざっくり書くとこんなかんじ。
// バッファサイズは使いながら増やせないので、最初に必要なだけ確保する。
// バイトオーダのデフォルトはビッグエンディアン
ByteBuffer byteBuf = ByteBuffer.allocate((int)fileDiscriptor.getLength())
.order(ByteOrder.LITTLE_ENDIAN);
// ファイルチャネルから直接読む
FileChannel channel = fileDiscriptor.createInputStream().getChannel();
channel.read(byteBuf);
// バッファ書き込みから読み出しモードに切り替える
byteBuf.flip();
// バッファの中身をdoubleの値として書き出す
double[] res = new double[byteBuf.capacity() / (Double.SIZE / 8)];
for (int i = 0; i < res.length; i++) {
res[i] = byteBuf.getDouble();
}
最初はres = byteBuf.asDoubleBuffer().array()
としていたが、これだとUnexpectedOperationみたいな例外が飛んできて怒られた。ByteBuffer#asDoubleBuffer()
はdouble[]
をallocateしないということなのだろうか。いろいろ悩んだ結果最後のfor
文のようにした。
ところで、件のメソッドのテストコードを読んでいて気になった。doubleBuffer.remaining()
が0のとき、アサーションを全く通らずにテストが成功してしまう。私の上のコードではbyteBuf.asDoubleBuffer().remaining()
が0になるんだよなー…