Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
超过字节[]数组长度(超过int上限)-java.lang.ArrayIndexOutOfBoundsException_Java_Byte_Bytearrayoutputstream - Fatal编程技术网

超过字节[]数组长度(超过int上限)-java.lang.ArrayIndexOutOfBoundsException

超过字节[]数组长度(超过int上限)-java.lang.ArrayIndexOutOfBoundsException,java,byte,bytearrayoutputstream,Java,Byte,Bytearrayoutputstream,我有一个ByteArrayOutputStream对象,我得到以下错误: java.lang.ArrayIndexOutOfBoundsException at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:113) 我试图通过一次写入一个250mb的字节[]块来加载一个包含多个Gig的文件 我可以观察字节大小的增长,一旦它达到长度2147483647(int的上限),它就会在下面的行中爆炸: stream.wr

我有一个ByteArrayOutputStream对象,我得到以下错误:

java.lang.ArrayIndexOutOfBoundsException at 
java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:113)
我试图通过一次写入一个250mb的字节[]块来加载一个包含多个Gig的文件

我可以观察字节大小的增长,一旦它达到长度2147483647(int的上限),它就会在下面的行中爆炸:

stream.write(buf); 
stream是ByteArrayOutputStream,buf是我正在以250mb的块写入流的内容

我本来打算这么做的

byte result[] = stream.toByteArray();

最后。是否有其他方法可以支持大于int上限的字节数组大小

Java中的数组不能超过
int
的界限

从:

DimExpr中每个维度表达式的类型必须是可转换为整型(§5.1.8)的类型,否则会发生编译时错误。每个表达式都经历一元数字提升(§)。升级的类型必须为int,否则会发生编译时错误;具体来说,这意味着维度表达式的类型不能太长

同样地,在:

arrayref必须是reference类型,并且必须引用数组。它从操作数堆栈中弹出。它引用的数组的长度已确定该长度作为int推送到操作数堆栈上

这基本上强制了数组的最大大小


加载数据后,您将如何处理数据还不太清楚,但我会尝试先不将数据全部加载到内存中。

使用多个数组。当您达到限制时,使用并重置。

使用ByteArrayOutputStream写入多个GiB的数据不是一个好主意,因为所有内容都必须保存在计算机内存中。正如您所注意到的,字节数组限制为2^31字节(2GiB)

此外,如果在缓冲区中写入更多数据,则用于存储该数据的缓冲区不会增长,因此,如果使用的缓冲区已满,则必须创建一个新的缓冲区(通常大小为两倍),并且必须将所有数据从旧的缓冲区复制到新的缓冲区中


我的建议是使用您获得的数据并将其保存到文件中。通过RandomAccessFile,您可以对大于2GiB的数据文件进行操作。

只是一个建议:不要在内存中存储那么大的数组。您真的需要将所有这些GIG同时存储在内存中吗?您真的需要640K以上吗?注意:考虑了一个关于大型阵列的建议,但没有将其纳入Java 7。也许我们会在Java 8中看到它?如果您有一台64G内存机器,用于运行科学实验,其中数据为30G,那么将所有内容加载到内存中是非常有意义的——这几乎总是会节省大量时间。可能会重复