2016-02-17 99 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是冗长的:类型声明定义了变量所遵守的契约。实例化选择将履行该合同的实现。