我正在使用以下方法读取整数文件:
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副本。
是否可以以这种方式使用代码,因此它只会在内存中创建一个副本?
答案 0 :(得分:6)
我所看到的javadocs和Oracle的实现表明你说的不是真的。 javadocs说:
public static ByteBuffer wrap(byte [] array)
将字节数组包装到缓冲区中。
新缓冲区将由给定的字节数组支持;也就是说,对缓冲区的修改将导致数组被修改,反之亦然。
代码显示传入array
的{{1}}只是被指定为ByteBuffer.wrap
的内部数组。 ByteBuffer
方法只显示使用ByteBuffer.asIntBuffer
创建的IntBuffer
。
答案 1 :(得分: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的堆。
BTW:这比使用堆缓冲区要快得多,因为它不需要从字节组装每个int
值。