【问题标题】:Convert huge file to encoded string in Java without any out of memory exception [closed]将大文件转换为Java中的编码字符串,没有任何内存不足异常[关闭]
【发布时间】:2021-05-27 08:20:11
【问题描述】:

我想在 Java 中将大文件转换为编码字符串,而不会出现任何内存不足异常。 请建议我最好的解决方案。

【问题讨论】:

  • 文件有多大?为什么你得到一个例外?您是否有适用于较小文件的代码,如果有,您可以展示一下吗?你打算用这个字符串做什么?了解字符串存储在内存中。所以如果文件那么大,你不可能把字符串保存在内存中——这没有任何意义。
  • byte[] byteArray = IOUtils.toByteArray(inputstream);String encodedString = Base64.getEncoder.encodeToString(byteArray);
  • 这只是解决我提到的事情。请花时间完全回答所问的一切。阅读How to Ask,谢谢。
  • 这是一个 70 mb 的文件,但我可能会同时收到多个请求
  • 从我的控制器我需要以 json 格式发送响应,json 应该包含一个属性,它的值应该是生成的编码字符串。{ "encodedProperty":encodedString}

标签: java inputstream encode


【解决方案1】:

Java 中的 java.lang.String 在内存中。你想要的完全是不可能的。编程没那么简单。您的选择是:

  1. 流式传输文件。如,分块处理文件;确保您的代码不需要String,也不需要查看文件中任何特定索引的能力,也不需要向前或向后看。

  2. 流和块的组合:继续从文件中读取数据,直到您看到某个分隔块或其他指示您拥有一块数据,然后处理该块,然后继续。确保输入没有任何大块(或定义一个块永远不会大于某个可管理的量),然后处理该块,而不考虑以前或未来的块。

  3. 使用 RandomAccessFile,但这要求您知道要查找的块的确切位置。这变得相当复杂。

  4. 忘记这一切,将文件转储到数据库中,然后与数据库进行交互。

'我只想要一个包含这个 10GB 文件内容的字符串而不占用 10GB 内存'是不可能

【讨论】:

  • 当我将整个编码字符串解码到一个文件时,编码字节块并附加相应的编码字符串并没有给我一个正确的文件。
【解决方案2】:

您可以尝试压缩到byte[]。使用new GZipOutputStream(new ByteArrayOutputStream())。如果数据可以压缩(并且不是已经压缩的视频等),那么它可能会起作用。

使用String 是个坏主意,因为始终完成字符集转换,并且字符串操作可能会调用char[]char 是2 个字节。您可以尝试 StandardCharsets.ISO_8859_1,一种单字节编码。通常会将字节编码为 Base64 ASCII,但这又将数据扩大了 33%。

尝试不同的东西。

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多