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();

但是,它会在内存中创建两个文件副本,1) 字节数组副本 2) IntBuffer 副本。

是否可以以这种方式使用代码,因此它只会在内存中创建一个副本?

4

2 回答 2

6

我看过的 javadocs 和 Oracle 的实现表明你所说的不是真的。javadocs说:

公共静态 ByteBuffer 包装(字节 [] 数组)

将字节数组包装到缓冲区中。

新缓冲区将由给定的字节数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。

代码显示,array传入ByteBuffer.wrap的内容被简单地分配为ByteBuffer. 该ByteBuffer.asIntBuffer方法仅显示了IntBuffer使用ByteBuffer.

于 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();

无论文件大小如何,这都会使用不到 1 KB 的堆。

顺便说一句:这比使用堆缓冲区要快得多,因为它不需要int从字节中组装每个值。

于 2012-07-11T18:53:30.947 回答