2016-02-17 97 views
0

是否有任何可能使用POI庫和Java改進對excel文件的讀寫? 現在我的代碼看起來像這樣:讀寫Excel文件的改進[POI,Java]

//Reading a file 
FileInputStream fin = new FileInputStream(new File(localizationOfExcelFile)); 
Workbook workbook = new XSSFWorkbook(fin); 

//Writing to a file 
FileOutputStream fout = new FileOutputStream(new File(localizationOfExcelFile)); 
workbook.write(fout); 
fout.close(); 

非常感謝!

+2

改進什麼?性能 –

+1

[poi網站](https://poi.apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook)也一樣。 –

+2

直接使用[File,而不是InputStream](http://poi.apache.org/spreadsheet/quick-guide.html#FileInputStream) - 更快+內存更低 – Gagravarr

回答

2

如果您正在寫入高延遲系統(如聯網硬盤驅動器),則應該使用BufferedOutputStream緩衝您的輸出。我將緩衝寫入到Windows上的網絡硬盤驅動器的寫入時間提高了一個數量級,而對於將寫入操作緩衝到本地硬盤驅動器的成本卻微不足道。性能可能因硬盤寫入緩存,操作系統和延遲而有所不同,因此如果其他人將使用您的應用程序,則不要針對您的設置進行優化。

如果有幫助,請緩衝您的輸入BufferedInputStream,儘管我的測試沒有經歷過改善。正如@Gagravarr建議的,嘗試使用File而不是FileInputStream打開工作簿。

如果您不知道是否打開Excel 97-2003或Excel 2007+文件(不要猜測基於文件擴展名;基於文件的前幾個字節的猜測優於),使用WorkbookFactory.create,但您需要使用FileInputStream來避免在關閉工作簿時(即使不保存)修改工作簿的bug

當你完成它們時關閉你的流(fin!)是一個很好的習慣。不確定是否打開Streams會影響內存,系統文件句柄資源或垃圾回收,但這可能會有所幫助。主要的是可讀性:你清楚地表明你已經完成了Stream對象。

最後,儘可能隱藏實現細節,即使在本地也是如此。儘可能使用OutputStream fout = new FileOutputStream(...)而不是FileOutputStream fout = ...。 Java是冗長的:類型聲明定義了變量所遵守的契約。實例化選擇將履行該合同的實現。