我想将巨大的文件转换为Java中的编码字符串,而没有任何内存不足的异常。请告诉我最好的解决办法。
一个java.lang。在java中,字符串在内存中。你想要的是完全不可能的。编程并没有那么简单。你的选择是:
-
流式传输文件。例如,在块中处理文件;确保您的代码既不需要
String
,也不需要查看文件中任何特定索引的能力,也不需要向前看或向后看。 -
流和块的组合:继续从文件中读取数据,直到您看到一些分隔块或其他指示,您有一个数据块,然后处理块,并继续。确保输入没有任何巨大的块(或者定义一个块永远不会超过一些可管理的量),然后处理块,而不考虑以前或将来的块。
-
使用RandomAccessFile,但这需要你知道你正在寻找的块的确切位置。这相当复杂。
-
忘掉这一切,将文件转储到数据库中,并与数据库交互。
'我只想要一个包含这个10GB文件内容的字符串,而不占用10GB内存'是不可能的.
您可以尝试压缩到byte[]
。使用new GZipOutputStream(new ByteArrayOutputStream())
。如果数据可以被压缩(并且不是已经压缩的视频之类的),那么它可能会工作。
使用String
是一个坏主意,因为总是完成Charset转换,并且字符串操作可能调用char[]
,char
是2字节。你可以试试StandardCharsets。ISO_8859_1,单字节编码。通常会将字节编码为Base64 ASCII,但这再次将数据扩大33%。
试试不一样的