【问题标题】:problems to write big String to a file将大字符串写入文件的问题
【发布时间】:2019-06-28 20:27:17
【问题描述】:

我正在尝试用Base64写一个String,这个String代表一个PDF文件,

for (int i = 0; i < 500; i++) {
        cedula++;
        escribirArchivo.escribirInfoEnElArchivo(data1.append(pdf).append(",").append(cedula).toString());
        escribirArchivo.escribirInfoEnElArchivo(data2.append(pdf2).append(",").append(cedula).toString());
        escribirArchivo.escribirInfoEnElArchivo(data3.append(pdf3).append(",").append(cedula).toString());
    }

这是我写文件的方法

  public void escribirInfoEnElArchivo( String infoToWrite) {
    try {
        fileWriter.write(infoToWrite + "\n");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这在某些时候消耗了大约 2-3GB 的内存,我用完了内存并抛出堆内存错误,我怎样才能以更好的方式执行此操作?

【问题讨论】:

  • 不要尝试先在内存中构建整个字符串。只需将其分段写入文件即可。
  • 这里需要minimal reproducible example...data1data2data3pdfpdf2pdf3 是什么?这些真的需要在内存中吗?正如发布的那样,它们每增加 500 倍
  • data 1, data 2, data3 是StringBuilder,pdf, pdf, pdf3 是Base64 String,代表三个不同大小的pdf
  • 你是不是故意不清理你的StringBuilders?我想在附加pdf + "," + cedula 500 次后,data1 会很长并且会占用大量内存。
  • 如何清除?

标签: java string file base64


【解决方案1】:

正如 azurefrog 在他的评论中所说,在写入之前先创建整个字符串对内存来说非常昂贵。无需构建字符串并将其传递给escribirInfoEnElArchivo(),只需传递pdf并使用文件编写器从那里写入。如果您需要附加其他信息,可以在编写 pdf 后在escribirInfoEnElArchivo() 中进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2014-04-12
    • 2019-04-27
    • 2011-10-24
    相关资源
    最近更新 更多