4

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

目前,我正在使用:

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

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

这工作正常,但由于有很多out.write电话,所以速度很慢。

因此,我尝试使用 aByteBuffer来代替:

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.

4

2 回答 2

7

使用 ByteBuffer 写入文件时较大的原因是因为您如何初始化 ByteBuffer。当您简单地编写 using 时writeInt(int),您只编写了您需要编写的数据。但是,当您创建 ByteBuffer 时,您创建的它比我理解的防止溢出所需的大。但是,这也意味着底层数组,即从array()方法返回的数组,也比它需要的大。由于数组不了解位置和限制,所以当你写数组时,所有的数据之后的空白空间都会被写入,导致文件很大。您需要做的是将所有数据放入缓冲区后,您需要翻转缓冲区,然后创建一个长度与limit()缓冲区(一旦翻转),然后get(byte[])是缓冲区中的所有数据。拥有数组后,您需要编写它。

这就是我所说的:

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

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

    buffer.flip();
    byte[] data = new byte[buffer.limit()];
    buffer.get(data);
    out.write(data);
}
于 2013-04-18T13:45:03.067 回答
0

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

于 2013-04-17T18:04:57.603 回答