【问题标题】:Reading a file into a byte-array with padding for 8-byte alignment - Java将文件读入字节数组并填充以进行 8 字节对齐 - Java
【发布时间】:2014-12-01 00:05:31
【问题描述】:

我需要将文件读入 Java 中的字节数组。幸运的是,this question 得到了很好的回答,我可以使用 Java 7 中的 nio 库。

但有一点不同:生成的字节数组的大小必须是 8 的倍数。额外的字节应该为空,即 \0。

是否有一种快速且易读的方法来用零填充字节数组,使其大小为 8 的倍数?请注意,这里的可读性和开发速度是关键——如果最好的解决方案除了简单地将文件读入字节数组之外还增加了几行,我宁愿简单地将整个缓冲区复制到一个新数组中。

编辑:

更多阅读表明我可以修改this answer 并将缓冲区的大小四舍五入到下一个 8。对此策略的安全性和/或有效性有什么想法吗?我相信缓冲区中超出文件末尾的字节将被初始化为零并且不受读取的影响 - 对吗?

【问题讨论】:

    标签: java arrays io


    【解决方案1】:

    由于 8 是 2 的幂,因此您可以快速获得下一个数字:

    int theSize = (orig + 7) & ~7;
    

    至于直接读入字节数组,你说你用nio;因此,从与文件关联的通道中分配一个具有请求大小的ByteBuffer.read()(使用FileChannel.open())。然后使用ByteBuffer.array()方法获取底层数组。 (注意:不要.allocateDirect()!否则.array() 将不起作用)

    如果你可以FileChannel.map() 到想要的大小,那将是理想的,不幸的是映射到更大的大小会修改底层文件,所以这里没有骰子......


    示例代码:

    final Path path = Paths.get("path/to/wanted/file");
    
    try (
        final FileChannel channel = FileChannel.open(path, StandardOpenOption.READ);
    ) {
        final int bufsize = ((int) channel.size() + 7) & ~7;
        final ByteBuffer buf = ByteBuffer.allocate(bufsize);
        channel.read(buf);
        return buf.array();
    }
    

    【讨论】:

    • 四舍五入到最接近 8 的好方法。我可能会使用我链接到的第二个答案中的方法,并使用您的公式来计算下一个索引。
    • 基于ReadableByteChannel接口,我认为这并不能保证一口气读完整个文件。当然,我链接的答案也有这个问题,但至少RandomAccessFile 有一个readFully 方法我可以使用。使用FileChannel 时,您将如何解决此问题?
    • 嗯,使用这种方法它永远不会为我读取整个文件...文档确实有点不清楚,但是一个简单的循环将解决这个问题:do { channel.read(buf); } while (buf.position() < channel.size());
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多