当前位置: 首页 > 面试题库 >

Java:将long型数组有效转换为字节型数组

翟博雅
2023-03-14
问题内容

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

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

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

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

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();

…但是我似乎找不到找到相反方向的功能。

据我所知,从转换时,有端的考虑longbyte,但我相信我已经解决了这些:我使用上面显示的缓冲架构,默认为大端,无论本地字节顺序。


问题答案:

关于效率,事实上,许多细节几乎没有什么不同。硬盘是目前为止涉及到的最慢的部分,在将单个字节写入磁盘所需的时间中,您可能已经将数千甚至数百万个字节转换为long。每一个性能测试在这里不会告诉你有关的任何性能
执行 ,但对性能 的硬盘 。毫无疑问,应该制定专门的基准,分别比较不同的转换策略和不同的书写方式。

假设主要目标是一种允许方便转换且不会造成不必要开销的功能,我想提出以下方法:

可以创建一个ByteBuffer足够大的尺寸,将其视为a LongBuffer,然后使用bulk
LongBuffer#put(long[])方法(该方法负责必要的字节序转换,并尽可能高效地执行此操作),最后,编写原始文件ByteBuffer(现已填充)使用long值)到文件FileChannel

遵循这个想法,我认为这种方法很方便并且(很可能)相当有效:

private static void bulkAndChannel(String fileName, long longArray[]) 
{
    ByteBuffer bytes = 
        ByteBuffer.allocate(longArray.length * Long.BYTES);
    bytes.order(ByteOrder.nativeOrder()).asLongBuffer().put(longArray);
    try (FileOutputStream fos = new FileOutputStream(fileName))
    {
        fos.getChannel().write(bytes);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

(当然,人们可能会争论分配“大”缓冲区是否是最好的主意。但是,由于有了Buffer类的便利方法,可以很容易地并通过合理的努力对其进行修改,以写入适当大小的数据“块”。
,对于一个人真的想写一个 巨大的 数组,而创建相应数组的内存开销却实在ByteBuffer太大了)



 类似资料:
  • 我有一个非常具体的要求。我有一个java应用程序,在这里我必须将字节数组转换为具有int、String等java类型的消息。消息的结构在c中定义如下- 我在java应用程序中收到的是字节数组。我不知道c应用程序是否使用proto缓冲区或任何其他方式来转换为字节数组。但是,如果我逐个字节地解析数组,我可以得到值。例如- 这一行将返回正确的id值(结构中的第一个属性是int)。 我的问题是——如果我为

  • 我必须在皈依前向小恩迪安下订单。 在第一种情况下,我很容易进行转换: 在第二种情况下,转换不起作用: 数字3832745171大于,但如果我试图转换为long,我也会遇到问题。 我怎么能这么做?谢谢。 尝试将字节数组转换为int/long类型。

  • 问题内容: 将转换为的快速方法是什么? 例如 问题答案: 看看ByteBuffer类。 设置字节顺序保证了,,和。 或者,你可以手动执行以下操作: 该班是专为尽管这样的脏手任务。实际上,私有定义了以下辅助方法:

  • 问题内容: 我有一个类型为TYPE_4BYTE_ABGR的字节数组,我知道它的宽度和高度,我想将其更改为BufferedImage,有什么想法吗? 问题答案: 可能效率不是很高,但是可以通过以下方式将a转换为另一种类型: 关于您要实现的方法,您必须知道图像的宽度或高度才能将a转换为a 。 编辑: 一种方法是将转换为(数据类型)并使用:

  • 问题内容: 我想在UDP协议中使用字节格式发送数据时遇到问题,问题是当我尝试使用json对象类型创建数据时,无法获取数据的字节格式,这是我的示例代码: 我知道我的问题,但我找不到如何将json对象转换为字节,有什么建议吗? 问题答案: 获取字符串的字节:

  • 问题内容: 这可能是一个简单的,总机问题,但我的第一次尝试令人惊讶地完全失败了。我想获取一组原始的long并将其转换成一个列表,我试图这样做: 什么是正确的方法? 问题答案: 我发现使用apache commons lang ArrayUtils(JavaDoc,Maven依赖项)很方便 它还具有反向API 编辑:更新以提供完整的转换为列表,如注释和其他修复建议。