2012-04-10 124 views
2

我需要優化使用太多堆內存的應用程序。 我在使用相同的關閉一個ByteArrayOutputStream變量時遇到了問題。我試圖使用close(),但它不起作用。這是代碼:什麼是關閉ByteArrayOutputStream的最佳方式?

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

它不起作用?你有錯誤嗎? – Dan 2012-04-10 19:48:37

+1

'ByteArrayOutputStream'將數據寫入字節數組。關閉'ByteArrayOutputStream'後,可以使用'toByteArray'方法訪問字節數組。簡單地關閉'ByteArrayOutputStream'將不會使字節數組符合垃圾回收。 – emory 2012-04-10 19:52:31

+0

我工作,但問題是,我有一個80MB的XML,並在我保存在C:後,我想釋放使用的堆內存。 – user1324916 2012-04-10 19:58:13

回答

8

您不能關閉一個ByteArrayOutputStream,因爲它是close()方法記錄爲

關閉一個ByteArrayOutputStream沒有效果。可以在關閉流之後調用此 類中的方法,而不會生成012xx生成IOException。

該輸出流由數組支持;它是不是一個緩衝流。如果您覺得它使用的內存太多,則應使用適當的OutputStream將字節直接輸出到某個端點(如文件或套接字)。

+0

問題是,我應該解壓FTP收到的文件,只是爲了獲取XML。我怎麼做,使用什麼? – user1324916 2012-04-10 19:59:59

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[]中)存儲在臨時文件中並將其讀回。

相關問題