2017-06-20 17 views
0

ByteArrayOutputStreamとZipOutPutSteamを使用して1つのzipファイルを作成していますが、約200MB近くの大きなzipファイルを作成するには時間がかかります。効率的な方法はありますか?ZipファイルをZipOutPutStreamからJax-rsを使用してダウンロード

 URL u = new URL(url); 
     URLConnection uc = u.openConnection(); 

     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ZipOutputStream zipOut = new ZipOutputStream(out); 
     zipOut.putNextEntry(new ZipEntry("file.csv")); 
     zipOut.write(IOUtils.toByteArray(uc.getInputStream())); 
     uc.getInputStream().close(); 
     zipOut.closeEntry(); 
     zipOut.close(); 

     ResponseBuilder response = Response.ok(out.toByteArray()); 
     response.header("Content-Disposition", "attachment; 
     filename=\"LMPeriod.zip\""); 
     return response.build(); 
+0

圧縮レベルで再生できます。ファイルをあらかじめ圧縮することができます。私。バックグラウンドで圧縮を行う仕事をしています。圧縮されたファイルをキャッシュすることができます。圧縮自体は、1kBのデータ+ファイルシステムからのデータの読み込みに約2マイクロ秒かかります。あなたの解決策(ファイル全体をメモリに読み込んでメモリに圧縮する)では、複数の同時ダウンロード要求があると、メモリの問題に遭遇する可能性があります。 – andih

答えて

0

ByteArrayOutputStreamの代わりにFileOutputStreamを使用して、ジップをディスクに書き込みます。 ByteArrayOutputStreamは圧縮結果をメモリにキャッシュします。ディスクに書き込む場合は、ZipOutputStreamをFileOutputStreamの周りにラップする必要があります。

+0

これは、ファイルの圧縮に時間がかかりすぎるという問題をどのように解決しますか?ファイルをディスクに書き込むのは、通常、メモリアクセス(メモリ1マイクロ秒、ディスクSSD 16マイクロ秒、圧縮1KB、約2マイクロ秒)よりも遅い20倍以上です。 – andih

関連する問題