Каков наилучший способ закрыть 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[]
) сохранить во временном файле и прочитать его обратно.