将大文件转换为 Java 中的编码字符串,没有任何内存不足异常

问题描述

我想在没有任何内存不足异常的情况下将大文件转换为 Java 中的编码字符串。 请建议我最好的解决方案。

解决方法

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

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

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

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

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

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

,

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

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

尝试不同的东西。