Java - IntBuffer包装

时间:2012-07-11 18:24:32

标签: java

我正在使用以下方法读取整数文件:

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副本。

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

2 个答案:

答案 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值。