【问题标题】:what is the best way to close a ByteArrayOutputStream?关闭 ByteArrayOutputStream 的最佳方法是什么?
【发布时间】:2012-04-10 19:46:11
【问题描述】:

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

【问题讨论】:

  • 怎么不行?你有错误吗?
  • A ByteArrayOutputStream 将数据写入字节数组。关闭ByteArrayOutputStream 后,可以使用toByteArray 方法访问字节数组。简单地关闭ByteArrayOutputStream 不会使字节数组符合垃圾回收条件。
  • 我可以工作,但问题是我有一个 80MB 的 XML,在我保存在 C: 之后,我想释放使用的堆内存。
  • 这是垃圾收集器的工作。确保您没有对 ByteArrayOutputStream 的额外引用。

标签: java memory stream heap-memory bytearrayoutputstream


【解决方案1】:

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

关闭 ByteArrayOutputStream 无效。本文中的方法 可以在流关闭后调用类 生成一个 IOException。

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

【讨论】:

  • 问题是我应该解压缩 FTP 接收到的文件,然后只获取其中的 XML。我该怎么做,使用什么?
【解决方案2】:

我认为您不小心使用了太多内存。 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[]),而是存储在一个临时文件中并读回。

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多