java - 使用 Bytebuffer 写出返回不同于简单写出

标签 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。这可以解释为什么 diff 会说它们不一样。

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

最佳答案

使用 ByteBuffer 写入的文件之所以更大,是因为您如何初始化 ByteBuffer。当您简单地使用 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);
}

关于java - 使用 Bytebuffer 写出返回不同于简单写出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066889/

相关文章:

java - 从 ByteBuffer 读取以 NUL 结尾的字符串

java - 如何避免 BufferOverflow 异常?

java - Java中如何将ArrayList数据类型插入MySQL数据库

java - hibernate session 工厂 : how to configure JNDI in Tomcat?

java - Micronaut:在 Spock 中模拟工厂创建的 Bean

java - 将控制权返回给java中的switch语句?

Java ByteBuffer BigEndian double

java - 在 Java 中使用 RandomAccessFile 编写非英文字符

java - Java外部文件的哈希函数

java - RandomAccessFile 字节顺序问题