2012-04-16 76 views
2

我需要提供一個功能,用戶可以在我的web應用程序中以excel/csv格式下載報告。一旦我在創建excel的Web應用程序中創建了一個模塊,然後將其讀取併發送到瀏覽器。它工作正常。這次我不想生成excel文件,因爲我沒有對文件系統的控制級別。我想一種方法是在StringBuffer中生成適當的代碼並設置正確的contenttype(我不確定這種方法)。其他團隊也有這個功能,但是當數據非常龐大時,他們正在掙扎。考慮到數據的大小,提供此功能的最佳方式可能非常巨大。是否可以在沒有客戶端注意的情況下發送數據塊(除了延遲下載)。 我忘記添加的一個問題是,當數據量非常大時,它也會在服務器端產生問題(CPU利用率和內存消耗)。是否有可能我讀了固定數量的記錄,如500,將其發送給客戶,然後讀取另一個500,直到完成。如何使用java高效下載大型csv文件

回答

2

您也可以生成HTML而不是CSV,並仍將內容類型設置爲Excel。這對着色和樣式文本很好。

當客戶端接受該壓縮時,您也可以使用gzip壓縮。通常有標準方法,像servlet過濾器。

從來沒有一個StringBuffer或更好的StringBuilder。更好地將其流出。如果你沒有(不能)調用setContentength,輸出就會被分塊(沒有預測性的進展)。

+0

請問你能解釋一下:從來沒有一個StringBuffer或更好的StringBuilder。更好地將其流出。 – dmay 2012-04-16 21:39:06

+0

由於StringBuffer具有(不必要的)同步,StringBuffer的性能低於後來的StringBuilder。當然你不想首先在StringB *中收集很多東西,然後流出來。作爲一個管道流出來的效率更高,特別是在多用戶場景中。 – 2012-04-17 13:15:18

+0

我查詢大約1000條記錄的數據庫,然後發送給客戶端,然後獲取下一批。這非常減少我的記憶足跡。我已經在profiler中測試並檢查了內存,並且它工作正常。現在我的應用程序不使用大量的內存。我可以在Profiler中看到,每當使用的內存達到臨界級別時,就會收集垃圾。 – dmay 2012-06-11 16:49:39

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();