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

在没有任何内存不足异常的情况下,在Java中将大型文件转换为编码字符串,java,inputstream,encode,Java,Inputstream,Encode,我想在没有任何内存不足异常的情况下,将巨大的文件转换为Java中的编码字符串。 请给我推荐最好的解决方案。内存中有java.lang.String。你想要的是完全不可能的。编程并不是那么简单。你的选择是: 流式传输文件。与中一样,分块处理文件;确保您的代码既不需要字符串,也不需要查看文件中任何特定的索引,也不需要向前或向后查看 流和块的组合:继续从文件中读取数据,直到您看到一些分隔块或其他表示您有一个数据块的指示,然后处理该块,然后继续。确保输入没有任何大数据块(或定义数据块永远不要大于某个可

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

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

  • 流式传输文件。与中一样,分块处理文件;确保您的代码既不需要
    字符串
    ,也不需要查看文件中任何特定的索引,也不需要向前或向后查看

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

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

  • 忘记所有这些,将文件转储到数据库中,并与数据库交互


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

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

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


    尝试不同的方法。

    文件有多大?为什么会有例外?你有适合小文件的代码吗?如果有,你能展示一下吗?你打算用这根绳子做什么?理解字符串存储在内存中。因此,如果文件那么大,您就不可能将字符串保存在内存中——这毫无意义;字符串encodedString=Base64.getEncoder.encodeToString(byteArray);这只是针对我提到的事情。请花时间完全回答所有问题。阅读,谢谢。这是一个70 mb的文件,但我可能会同时收到来自控制器的多个请求。我需要以json的形式发送响应,json应该包含一个属性,它的值应该是生成的编码字符串。{“encodedProperty”:encodedString}当我将整个编码字符串解码到一个文件中时,对字节块进行编码并附加相应的编码字符串并没有给我一个正确的文件。