Размер InputStream не может быть получен в java, если он превышает 1 ГБ. нужно больше исключений из буфера. как разрешить?

Я использую поток ввода для чтения данных и byteArray для получения размера. Я получаю outOfMemory, мне нужен новый буфер в массиве байтов, так как размер файла составляет 1,5 ГБ. Я проверил stackru и искал много мест в Google. Я не мог найти решение, чтобы получить размер. Пожалуйста, помогите мне получить размер из входного потока или любым другим лучшим способом. Спасибо.

Пакет IOUtils - import org.apache.commons.io.IOUtils;

private void writeIntoResponse(String uri, String id, String fileName, HttpServletResponse response)
       try (InputStream in = /*read(uri,id,fileName)reading from s3*/) { //1.5 gb file

           response.setContentType("application/octet-stream");
           byte[] bytes = IOUtils.toByteArray(in); //getting error out of memory issue           
           response.setHeader("Content-Length", String.valueOf((long)bytes.length)); // we needs to set bytes length as we need must
           OutputStream responseOutputStream = response.getOutputStream();           
           responseOutputStream.write(bytes);
           response.flushBuffer();
        } 
    catch (Exception e) {
        ////error
    }
   }

Я получаю сообщение об ошибке, как показано ниже.

Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.apache.commons.io.output.ByteArrayOutputStream.needNewBuffer(ByteArrayOutputStream.java:122) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.output.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153) ~[commons-io-2.4.jar:2.4]

2 ответа

Вы загружаете в оперативную память 1,5 ГБ данных. Попробуйте читать и писать построчно, а не весь файл сразу

Не загружайте файл размером 1,5 ГБ в память. Избавьтесь от этой строки:

byte[] bytes = IOUtils.toByteArray(in);

Узнайте длину внешнего файла в байтах и ​​используйте ее вместо bytes.length с помощью:

len = Files.size(Paths.get(fileName))

или

len = new File(fileName).length();

Перенесите вход на выход, заменив:

responseOutputStream.write(bytes);

по

in.transferTo(out);
Другие вопросы по тегам