Jasper report exporting to text results in java.lang.OutOfMemoryError: Java heap space

Jasper report exporting to text results in java.lang.OutOfMemoryError: Java heap space

目前我正在使用 jasper v 3.7.4

从同一个 dataset 导出为任何其他格式(csvxlspdf)时 - 我没有任何问题。

导出到 text 抛出:

java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3236) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)

这是我的代码:

    byte[] bytes = null;
    JRTextExporter  exporter = new JRTextExporter();
    ByteArrayOutputStream txtReport = new ByteArrayOutputStream();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, txtReport);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
    exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
    exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
    exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
    exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
    exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);
    
    exporter.exportReport();
    bytes = txtReport.toByteArray();

    FileOutputStream fos = new FileOutputStream("c:\myfile.txt")
    System.out.println(bytes.length/1024+" Kbytes");
    fos.write(bytes, 0, bytes.length);
    fos.flush();
    fos.close();

我也在使用 virtualizer 作为 jasperPrint 参数

 JRFileVirtualizer virtualizer = new JRFileVirtualizer(150);
 virtualizer.setReadOnly(false);
 params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

但这并没有帮助,还显示了以下警告:

WARNING: Parameter "REPORT_VIRTUALIZER" already registered, skipping this one.

鉴于csv也是一个“text”文件并且生成没有任何问题,有点奇怪 导出到 text 失败。

可能是我提供给出口商的参数有问题?

谢谢。

虽然 textcsv 可能都是 基于文本的 格式,但它们 不同 格式,因此不要采用相同数量的 space.

向内存生成任何内容(通常是报告)是危险的,因为虽然它可能在测试中有效,但在生产中导致 OOME 的大型报告会造成严重破坏。

生成内容时使用真实流。 FileOutputStream,网络流,任何不在内存中存储内容的适当流。如果您将 ByteArrayOutputStream 用于“实际工作”,您很可能做错了什么。

立即将报告输出到文件,而不是先收集它。

try (FileOutputStream fos = new FileOutputStream("c:\myfile.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos)) {
    JRTextExporter  exporter = new JRTextExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, bos);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, "mytxt.txt");
    exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
    exporter.setParameter(JRTextExporterParameter.CHARACTER_WIDTH, 2.0F);
    exporter.setParameter(JRTextExporterParameter.PAGE_WIDTH, 100.0F);
    exporter.setParameter(JRTextExporterParameter.CHARACTER_HEIGHT, 4.0F);
    exporter.setParameter(JRTextExporterParameter.PAGE_HEIGHT, 50.0F);

    exporter.exportReport();
}