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

close()メソッドは次のように文書化されているため、ByteArrayOutputStream を閉じることはできません。

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 ファイル全体をメモリ ( byte[]) に格納する代わりに、一時ファイルに格納して読み戻します。

于 2012-04-10T19:51:44.963 に答える