7

私は以下を使用して整数ファイルを読んでいます:

int len = (int)(new File(file).length());
FileInputStream fis = new FileInputStream(file);
byte buf[] = new byte[len];
fis.read(buf);
IntBuffer up = ByteBuffer.wrap(buf).order(ByteOrder.LITTLE_ENDIAN).asIntBuffer();

ただし、メモリ内にファイルの2つのコピー、1)バイト配列コピー2)IntBufferコピーを作成します。

このような方法でコードを使用して、メモリにコピーを1つだけ作成することは可能ですか?

4

2 に答える 2

6

私が見たjavadocsとOracleの実装は、あなたが言っていることが真実ではないことを示しています。javadocsによると:

public static ByteBuffer wrap(byte [] array)

バイト配列をバッファにラップします。

新しいバッファは、指定されたバイト配列によってバックアップされます。つまり、バッファを変更するとアレイが変更され、その逆も同様です。

このコードは、array渡されたByteBuffer.wrapが単にの内部配列として割り当てられていることを示していByteBufferます。このメソッドは、を使用するByteBuffer.asIntBufferの作成を示すだけです。IntBufferByteBuffer

于 2012-07-11T18:37:42.773 に答える
2

これをと比較することをお勧めします

FileChannel fc = new FileInputStream(file).getChannel();
IntBuffer ib = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size())
        .order(ByteOrder.LITTLE_ENDIAN).asIntBuffer();

これは、ファイルサイズに関係なく、1KB未満のヒープを使用します。

intところで:これは、バイトから各値をアセンブルする必要がないため、ヒープバッファを使用するよりもはるかに高速です。

于 2012-07-11T18:53:30.947 に答える