我有一个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/