java - InputStream Size 超过 1 GB 时无法在 java 中获取。需要更多缓冲区异常。如何解决?
问题描述
我正在使用 inputstream 来读取数据并使用 byteArray 来获取大小。由于文件大小为 1.5 gb,我遇到了 outOfMemory 问题,需要 bytearray 中的新缓冲区。我已经检查了 stackoverflow 并用谷歌搜索了很多地方。我找不到获得尺寸的解决方案。请帮助我从输入流或任何其他最佳方式中获取大小。谢谢。
IOUtils 包 - 导入 org.apache.commons.io.IOUtils;
private void writeIntoResponse(String uri, String id, String fileName, HttpServletResponse response)
try (InputStream in = /*read(uri,id,fileName)reading from s3*/) { //1.5 gb file
response.setContentType("application/octet-stream");
byte[] bytes = IOUtils.toByteArray(in); //getting error out of memory issue
response.setHeader("Content-Length", String.valueOf((long)bytes.length)); // we needs to set bytes length as we need must
OutputStream responseOutputStream = response.getOutputStream();
responseOutputStream.write(bytes);
response.flushBuffer();
}
catch (Exception e) {
////error
}
}
我收到如下错误。
Caused by: java.lang.OutOfMemoryError: Java heap space
at org.apache.commons.io.output.ByteArrayOutputStream.needNewBuffer(ByteArrayOutputStream.java:122) ~[commons-io-2.4.jar:2.4]
at org.apache.commons.io.output.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) ~[commons-io-2.4.jar:2.4]
解决方案
不要将 1.5GB 文件加载到内存中。摆脱这一行:
byte[] bytes = IOUtils.toByteArray(in);
找出以字节为单位的外部文件的长度,并使用它代替 bytes.length :
len = Files.size(Paths.get(fileName))
或者
len = new File(fileName).length();
通过替换将输入转换为输出:
responseOutputStream.write(bytes);
经过
in.transferTo(out);
推荐阅读
- python - numpy.core._exceptions.UFuncTypeError: ufunc 'subtract' 不包含签名匹配类型的循环
- python-3.x - 如果后面有 STDIN,则不会打印 STDOUT 的最后一行
- jquery - 如何使用 jQuery 从 JSON 数组中获取值
- android - 我可以在 kotlin 的 if () 中使用响应吗?
- graphviz - Graphviz:如何使用 circo 布局仅将节点放置在下半圆中?
- javascript - React:无法在“节点”上执行“removeChild”:要删除的节点不是该节点的子节点
- html - CSS 关键帧动画在 Safari 上不流畅,但在 Chrome 上有效
- database - 如何在 postgreSQL 中删除和重新创建数据库(错误:template1 已被使用)
- python - 正则表达式在与 IPS 和主机名匹配的组中返回错误
- amazon-dynamodb - DynamoDB 用于不断发展的应用程序