问题描述
我想在没有任何内存不足异常的情况下将大文件转换为 Java 中的编码字符串。 请建议我最好的解决方案。
解决方法
java.lang.String,在java中,在内存中。你想要的完全不可能。编程没那么简单。您的选择是:
-
流式传输文件。如在,以块的形式处理文件;确保您的代码既不需要
String
,也不需要查看文件中任何特定索引的能力,也不需要向前看或向后看。 -
流和块的组合:继续从文件中读取数据,直到看到一些分隔块或其他指示您有一个数据块,然后处理该块,并继续。确保输入没有任何大块(或定义一个块永远不会大于某个可管理的数量),然后处理该块,不考虑之前或未来的块。
-
使用 RandomAccessFile,但这要求您知道要查找的块的确切位置。这变得相当复杂。
-
忘记这一切,将文件转储到数据库中,然后与数据库进行交互。
“我只想要一个包含这个 10GB 文件内容而不占用 10GB 内存的字符串”是不可能的。
,您可以尝试压缩为 byte[]
。使用 new GZipOutputStream(new ByteArrayOutputStream())
。如果数据可以压缩(并且不是已经压缩的视频等),那么它可能会起作用。
使用 String
是个坏主意,因为总是进行字符集转换,并且字符串操作可能会调用 char[]
,char
为 2 个字节。您可以尝试 StandardCharsets.ISO_8859_1,一种单字节编码。通常人们会将字节编码为 Base64 ASCII,但这又将数据放大了 33%。
尝试不同的东西。