Java:有效地将长整型数组转换为字节数组

标签 java arrays type-conversion long-integer endianness

我有一个longs数组,我想写入磁盘。最高效的磁盘 I/O 函数采用字节数组,例如:

FileOutputStream.write(byte[] b, int offset, int length)

...所以我想首先将我的 long[] 转换为 byte[] (每个 long 8 个字节)。我正在努力寻找一种干净的方法来做到这一点。

似乎不允许直接类型转换:

ConversionTest.java:6: inconvertible types
found   : long[]
required: byte[]
    byte[] byteArray = (byte[]) longArray;
                            ^

通过迭代数组很容易进行转换,例如:

ByteBuffer bytes = ByteBuffer.allocate(longArray.length * (Long.SIZE/8));
for( long l: longArray )
{
    bytes.putLong( l );
}
byte[] byteArray = bytes.array();

...然而,这似乎比简单地将 long[] 视为一系列字节效率低得多。

有趣的是,当读取文件时,很容易使用缓冲区从byte[]“转换”为long:

LongBuffer longs = ByteBuffer.wrap(byteArray).asLongBuffer();

...但我似乎找不到任何相反方向的功能。

我知道从 long 转换为 byte 时需要考虑字节序,但我相信我已经解决了这些问题:我正在使用上面所示的 Buffer 框架,无论 native 字节顺序如何,默认为大端字节序。

最佳答案

不,没有一种简单的方法可以将 long[] 转换为 byte[]

您最好的选择可能是用 BufferedOutputStream 包装您的 FileOutputStream,然后为每个 long 写出单独的 byte(使用按位运算符)。

另一种选择是创建一个 ByteBuffer 并将您的 long 值放入 ByteBuffer 中,然后将其写入 FileChannel。这会为您处理字节顺序转换,但会使缓冲更加复杂。

关于Java:有效地将长整型数组转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927238/

相关文章:

java - 如何正确使用共享BlockingQueue?

java - JavaFX线程中的“异步while循环”

java - 如何确定用于绘制折线图的一系列数字的正确域?

c - 从 "0x4000"(例如)字符串获取十六进制值并将其存储在变量中。

java - Spring批量写入ActiveMQ

c - 存储指向非指定大小数组的指针

PHP为MYSQL Info的每行创建新数组,并将数组存储在数组中

c++ - 在 C++ 的范围 for 循环中使用匿名数组

C++ 编译器可以默默地接受错误的转换并引入不可预测的错误

swift - 从字节数据中提取 float