2012-04-10 7 views
2

J'ai besoin d'optimiser une application qui utilise trop de mémoire de tas. Je rencontre un problème lors de la fermeture d'une variable ByteArrayOutputStream après l'avoir utilisée. J'ai essayé de faire en utilisant close() mais ça ne marche pas. c'est le code:Quelle est la meilleure façon de fermer un 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

Comment ça ne marche pas? Avez-vous une erreur? – Dan

+1

Un 'ByteArrayOutputStream' écrit des données dans un tableau d'octets. Après la fermeture de 'ByteArrayOutputStream', le tableau d'octets est accessible avec la méthode' toByteArray'. La simple fermeture de 'ByteArrayOutputStream' ne rendra pas le tableau d'octets éligible pour la récupération de place. – emory

+0

je travaille, mais le problème est que j'ai un XML de 80 Mo et après avoir enregistré en C:, je voudrais libérer la mémoire tas utilisé. – user1324916

Répondre

8

Vous ne pouvez pas fermer une ByteArrayOutputStream, car il est la méthode close() est documentée comme

Fermeture d'une ByteArrayOutputStream n'a pas d'effet. Les méthodes de cette classe peuvent être appelées après que le flux a été fermé sans générant une IOException.

Ce flux de sortie est soutenu par un tableau; c'est PAS un flux tamponné. Si vous pensez qu'il utilise trop de mémoire, vous devez générer des octets directement sur un point de terminaison, tel qu'un fichier ou une socket, en utilisant un OutputStream approprié.

+0

le problème est que je devrais décompresser le fichier reçu par FTP et juste pour obtenir le XML qui est po Comment puis-je faire cela, en utilisant quoi? – user1324916

3

Je pense que vous utilisez trop peu de mémoire. close() n'a rien à voir avec ça. En fait, il n'est pas nécessaire de fermer ByteArrayOutputStream. Ici, vous copiez le fichier ZIP dans enveloppées tableau byte[]:

ByteArrayOutputStream zipOutTempStream = new ByteArrayOutputStream(); 
StreamUtils.copiarStream(arquivo.getZipStream(), zipOutTempStream); 

et quelques lignes vous convertir plus tard le tableau byte[] Retour à InputStream:

StreamUtils.copiarStream(StreamUtils.uncompressXmlFromZipStream(
    new ByteArrayInputStream(zipOutTempStream.toByteArray()) 
), arquivo2); 

On dirait que ce produit byte[] tableau est assez énorme (confirmer avec journalisation). Au lieu de stocker le fichier ZIP entier en mémoire (dans byte[]), stockez-le dans un fichier temporaire et relisez-le.

Questions connexes