4

我需要优化使用过多堆内存的应用程序。使用 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;
4

2 回答 2

10

您不能关闭 ByteArrayOutputStream,因为它的close()方法记录为

关闭 ByteArrayOutputStream 无效。可以在流关闭后调用此类中的方法,而不会生成 IOException。

这个输出流由一个数组支持;它不是缓冲流。如果您觉得它使用了太多内存,您应该使用适当的 OutputStream 将字节直接输出到某个端点,例如文件或套接字。

于 2012-04-10T19:51:16.973 回答
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 文件存储在内存中 (in byte[]) 存储在一个临时文件中并读回它。

于 2012-04-10T19:51:44.963 回答