【发布时间】:2023-03-30 07:32:01
【问题描述】:
我从其他方法获得了一个 ByteArrayInputStream 格式的非常大的文件(>2.5GB)数据。我必须将此数据以 InputStream 格式传递给另一个方法。我编写了以下代码,对于较小的文件执行良好,但对于超过 2GB 大小的大文件,它会失败。
ByteArrayInputStream bais = null;
bais = method_Returns_FIle_In_ByteArrayInputStream_Format();
InputStream is = bais;
method_Where_To_send_Data_In_InputStream_Format(is);
但我的代码本身在第二行中断,出现以下错误:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236)
at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
已经尝试增加 Java 堆空间大小(-Xms 和 -Xmx)。
欢迎提出任何建议。
【问题讨论】:
-
为什么要将整个文件加载到内存中?是否可以选择只使用
FileInputStream? -
找到一个解决方案,这样您就不必在处理内存之前将所有内容加载到内存中(例如,使用来自磁盘或网络的不同类型的输入流)。
-
@Progman 我看不到如何在这里使用 FileInputStream?目前是 Java 新手。
-
@MarkRotteveel 我会尝试找到与这些相关的示例。
-
@suchit A
FileInputStream让您无需将文件完全读入内存即可访问文件。由于它是从InputStream扩展而来的,因此您可以在method_Where_To_send_Data_In_InputStream_Format()方法中使用它。
标签: java out-of-memory inputstream bytearrayoutputstream bytearrayinputstream