使用Bytebuffer写出的返回与简单的写出不同

时间:2013-04-17 17:56:55

标签: java bytebuffer randomaccessfile

我正在尝试将字节数据写入文件并进行优化,我希望减少写入文件的次数。

目前,我正在使用:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {

    for(int i = 0; i < totalPkts; i++) {
        out.writeInt(data.get(i));
    }
}

这样可以正常工作,但由于有很多out.write次呼叫,因此速度很慢。

相反,我试图使用ByteBuffer来代替:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {
    ByteBuffer buffer = ByteBuffer.allocate(totalPkts*4); // prevent BufferOverflow

    for(int i = 0; i < totalPkts; i++) {
        buffer.putInt(data.get(i));
    }
    out.write(buffer.array());
}

这两种方法生成的文件大小不同。 ByteBuffer文件几乎比普通输出文件大整整mb。这可以解释为什么差异会说他们不一样。

我尝试使用DataOutputStream,结果是一样的。 使用ByteBuffer编写的文件仍然比不使用ByteBuffer的文件大1 MB。

2 个答案:

答案 0 :(得分:7)

使用ByteBuffer编写文件时更大的原因是您初始化ByteBuffer的原因。当您使用writeInt(int)编写时,您只编写需要编写的数据。但是,当你创建ByteBuffer时,你创建它比它需要的大,以防止我理解的溢出。但是,这也意味着从array()方法返回的基础数组也大于它需要的数组。由于数组不理解位置和限制,因此在编写数组时,所有数据都会写入空白空间,从而导致文件大小。你需要做的是在将所有数据放入缓冲区之后,需要翻转缓冲区,然后创建一个新的数组,其长度与缓冲区的limit()相同(一旦翻转),然后{ {1}}来自缓冲区的所有数据。一旦你拥有那个数组,就需要编写它。

这就是我所说的:

get(byte[])

答案 1 :(得分:0)

如果要减少写入量,请考虑使用字节数组写入文件流。 (假设数据变量中的数据可以转换为字节)。至于不一样,请检查您是否在某个时刻冲洗流并在程序终止前正确关闭它。