我需要优化使用过多堆内存的应用程序。 我在使用相同的文件后关闭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;
答案 0 :(得分:9)
您无法关闭ByteArrayOutputStream,因为它的close()方法记录为
关闭ByteArrayOutputStream无效。这个方法 在没有关闭流之后可以调用class 生成IOException。
此输出流由数组支持;它是 NOT 缓冲流。如果您觉得使用了太多内存,则应使用适当的OutputStream将字节直接输出到某个端点,例如文件或套接字。
答案 1 :(得分:3)
我认为你不小心使用了太多的记忆。 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[]
中)存储在临时文件中并将其读回。