У меня есть веб-приложение для составления отчетов. Приложение получает данные из базы данных и сохраняет данные в объекте StringWriter
. Я должен получить эти данные в формате байтового массива, чтобы создать CSV-файл и отправить его в браузер.
Ниже приведен фрагмент кода
return new FileTransfer(fileName, reportType.getMimeType(),
new ByteArrayInputStream(generateCSV(reportType, grid, new DataList(), params).toString().getBytes("UTF-8")));
, где generateCSV
возвращает объект StringWriter
, затем для преобразования его в байтовый массив, который я вызываю toString
, а затем метод getBytes()
. Ниже показано, как выглядит метод generateCSV
StringWriter generateCSV(ReportType reportType, GridConfig grid, DataList dataList, String params) {......}
Проблема в том, что, когда в моем отчете есть огромные записи (более 1 миллиона), метод getBytes()
завершается с ошибкой
java.lang.OutOfMemoryError: Размер запрашиваемого массива превышает ограничение виртуальной машины
Все данные отчета при преобразовании в объект String имеют огромное количество символов (миллиарды). Метод .getBytes("UTF-8")
преобразует его в массив, каждый элемент массива в виде одного символа. А для 1 миллиона записей размер символа превышает ограничение размера MAX JVM ARRAY (https://plumbr.io/outofmemoryerror/requested-array-size-exceeds-vm-limit).
Теперь, как я могу избежать использования toString().getBytes("UTF-8")
, чтобы избежать ошибки OOM? Есть ли лучший подход для преобразования в байтовый массив из StringWriter
?