2012-04-10 6 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

+1

«ByteArrayOutputStream» записывает данные в массив байтов. После закрытия 'ByteArrayOutputStream' массив байтов доступен с помощью метода' toByteArray'. Простое закрытие 'ByteArrayOutputStream' не сделает байтовый массив подходящим для сбора мусора. – emory

+0

Я работаю, но проблема в том, что у меня есть XML 80 МБ, и после того, как я сохраню в C:, я бы хотел освободить используемую память кучи. – user1324916

ответ

8

Вы не можете закрыть ByteArrayOutputStream, так как это close() метод документирована как

Закрытие ByteArrayOutputStream не имеет никакого эффекта. Методы в этом классе можно вызвать после того, как поток был закрыт без , генерируя исключение IOException.

Этот выходной поток поддерживается массивом; это NOT буферизованный поток. Если вы считаете, что использует слишком много памяти, вы должны выводить байты непосредственно на некоторую конечную точку, такую ​​как файл или сокет, используя соответствующий OutputStream.

+0

проблема заключается в том, что я должен разархивировать файл, полученный по FTP, и просто получить XML-файл, который находится внутри. Как я могу это сделать, используя что? – user1324916

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[]) храните во временном файле и читайте его обратно.

Смежные вопросы