Java 创建字节数组,其大小由长整型表示

2022-09-01 13:16:42

我正在尝试创建一个字节数组,其大小为类型。例如,可以将其视为:long

long x = _________;
byte[] b = new byte[x]; 

显然,您只能为字节数组的大小指定 an。int

在有人问我为什么需要这么大的字节数组之前,我会说我需要封装我没有编写的消息格式的数据,其中一个消息类型的长度为无符号int(在Java中)。long

有没有办法创建这个字节数组?

我在想,如果没有办法绕过它,我可以创建一个字节数组输出流并继续为它提供字节,但我不知道对字节数组的大小是否有任何限制......


答案 1

(对于OP来说可能有点晚了,但它可能对其他人仍然有用)

不幸的是,Java不支持具有超过2个31−1个元素的数组。阵列的最大占用空间为 2 GiB,阵列的最大空间消耗为 16 GiB。byte[]long[]

虽然它可能不适用于这种情况,但如果数组是稀疏的,您可能能够使用像Map这样的关联数据结构将每个使用的偏移量与适当的值相匹配。此外,与标准 Java 集合相比,Trove 为存储基元值提供了更节省内存的实现。

如果数组不是稀疏的,并且您确实确实需要内存中的整个 blob,则可能必须使用二维结构,例如,将匹配的偏移量模数 1024 转换为正确的 1024 字节数组。即使对于稀疏数组,此方法也可能提高内存效率,因为相邻的填充单元格可以共享相同的条目。MapMap


答案 2

最大大小为 32 位有符号整数的 A 将需要 2GB 的连续地址空间。您不应尝试创建这样的数组。否则,如果大小不是那么大(它只是一个更大的类型),你可以安全地将其转换为 a 并使用它来创建数组。byte[]int