Каков наилучший способ закрыть ByteArrayOutputStream?

Мне нужно оптимизировать приложение, которое использует слишком много кучи памяти. У меня проблемы с закрытием переменной ByteArrayOutputStream после использования того же самого. Я пытался сделать с помощью close(), но это не работает. это код:

ByteArrayOutputStream zipOutTempStream = new ByteArrayOutputStream();
//arquivo.getZipStream() has the XML received by FTP.
//STreamEtils is the function who transfers the XML to zipOutTempStream
StreamUtils.copiarStream(arquivo.getZipStream(), zipOutTempStream);

            //Creating a new XML to write over this.
            File arquivo1 = new File("C:/XML.xml");
            if (arquivo1.exists()) {
                System.out.println("ele existe");
            } else {
                if (arquivo1.createNewFile()) {
                    System.out.println("arquivo criado");
                } else {
                    System.out.println("arquivo não criado");
                }
            }

            FileOutputStream arquivo2 = new FileOutputStream(arquivo1);
            //Copy the unziped XML to the new xml created.
            StreamUtils.copiarStream(StreamUtils                .uncompressXmlFromZipStream(new ByteArrayInputStream(zipOutTempStream.toByteArray())), arquivo2);
            arquivo.setZipStream(null);
            arquivo.setXmlStream(null)      
return arquivo;

2 ответа

Вы не можете закрыть ByteArrayOutputStream, так как его метод close() задокументирован как

Закрытие ByteArrayOutputStream не имеет никакого эффекта. Методы в этом классе могут быть вызваны после закрытия потока без генерации исключения IOException.

Этот выходной поток поддерживается массивом; это НЕ буферизованный поток. Если вы чувствуете, что он использует слишком много памяти, вы должны вывести байты напрямую в какую-то конечную точку, например в файл или сокет, используя соответствующий OutputStream.

Я думаю, что вы небрежно используете слишком много памяти. close() не имеет к этому никакого отношения. На самом деле нет необходимости закрывать ByteArrayOutputStream, Здесь вы копируете ZIP файл в упакованный byte[] массив:

ByteArrayOutputStream zipOutTempStream = new ByteArrayOutputStream();
StreamUtils.copiarStream(arquivo.getZipStream(), zipOutTempStream);

и через несколько строк вы преобразуете byte[] массив обратно в InputStream:

StreamUtils.copiarStream(StreamUtils.uncompressXmlFromZipStream(
  new ByteArrayInputStream(zipOutTempStream.toByteArray())
), arquivo2);

Похоже, это сгенерировано byte[] массив довольно большой (подтвердите с регистрацией). Вместо того, чтобы хранить весь файл ZIP в памяти (в byte[]) сохранить во временном файле и прочитать его обратно.

Другие вопросы по тегам