2012-04-16 7 views
2

ウェブアプリケーションでExcelの/ CSV形式でレポートをダウンロードできる機能を提供する必要があります。いったん私はエクセルを作成し、それを読んでブラウザに送ったWebアプリケーションでモジュールを作りました。それは正しく働いていた。今回は、ファイルシステムを制御するレベルがないため、Excelファイルを生成したくありません。私は1つの方法は、StringBufferで適切なコードを生成し、正しいcontenttype(私はこのアプローチについてはわからない)を設定することだと思います。他のチームもこの機能を備えていますが、データが非常に大きいときには苦労しています。データのサイズを考えると、この機能を提供する最良の方法は非常に大きい可能性があります。クライアントに気付かないでチャンクでデータを送信することは可能ですか(ダウンロードの遅延を除く)。 追加することを忘れた1つの問題は、非常に大きなデータがある場合、またサーバー側で問題を作成する(CPU使用率とメモリ消費)ということです。私は500のようなレコードの固定量を読んで、それをクライアントに送ってから、完成まで別の500を読むことが可能ですか?Javaを使用して大容量のcsvファイルを効率的にダウンロードする方法

答えて

2

また、CSVではなくHTMLを生成して、コンテンツタイプをExcelに設定することもできます。これは、着色やスタイル付きのテキストに適しています。

クライアントが圧縮を受け入れる場合、gzip圧縮を使用することもできます。通常、サーブレットフィルタのような標準的な手段があります。

決してStringBufferまたはよりよいStringBuilder。それをストリーミングする方が良い。 setContentengthを呼び出すことができない(できない)場合、出力は(予測的な進歩なしに)チャンクされます。

+0

これを説明してください:決してStringBufferまたはよりよいStringBuilderそれをストリーミングする方が良い。 – dmay

+0

StringBufferが(不要な)同期化を行っているため、StringBufferは後のStringBuilderよりパフォーマンスが劣ります。もちろん、StringB *で最初にたくさんのものを集めてから流すことは望ましくありません。それをストリーミングするパイプラインは、特にマルチユーザーのシナリオでは非常に効率的です。 –

+0

私は約1000レコードのデータベースを照会し、それをクライアントに送り、次のバッチを取り出します。これは私のメモリフットプリントを非常に減少させます。私は、プロファイラでメモリをテストしてチェックしており、うまくいきます。今では、私のアプリケーションは大量のメモリを使いません。私は、使用されるメモリがクリティカルレベルに達するたびにガベージコレクションされることをプロファイラで確認できます。 – dmay

0
URL url = new URL("http://localhost:8080/Works/images/address.csv"); 

       response.setHeader("Content-Type", "text/csv"); 
       response.setHeader("Content-disposition", "attachment;filename=myFile.csv"); 

       URLConnection connection = url.openConnection(); 
       InputStream stream = connection.getInputStream(); 

       BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); 
       int len; 
        byte[] buf = new byte[1024]; 
        while ((len = stream.read(buf)) > 0) { 
         outs.write(buf, 0, len); 
        } 
        outs.close(); 
関連する問題