2012-06-18 88 views
0

我在JDK 1.5环境中使用apache POI 3.7,在JVM参数中使用-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=1000M在创建XSSFWorkbook时阻止Apache POI

我写的代码读取这样的XLSX文件,

File file = new File("C:\\D\\Data Book.xlsx"); 
InputStream inputStream = new FileInputStream(file); 
OPCPackage opcPackage = OPCPackage.open(inputStream); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

在它进入空闲状态的第四行。如果我删除JVM参数,它会抛出OutOfMemoryError。我的文件大小是6MB。

+0

你怎么知道它是处于空闲状态?它能不能继续处理? –

+0

感谢您的回复,是的,它没有继续。有时它会抛出OutOfMemoryError。 –

+0

这表明a)它不是空闲的,b)你需要在已经指定的内容之上分配额外的内存。 –

回答

1

如果使用OPCPackage不是必要的话,我会去直实例:

InputStream inp = new FileInputStream("C:\\D\\Data Book.xlsx"); 
Workbook wb = WorkbookFactory.create(inp); 

POI Quick Guide

+0

谢谢你们。我通过使用apache POI的事件API解决了这个问题。 http://poi.apache.org/spreadsheet/how-to.html。 –

1

如果你有一个文件,然后通过在使用一个InputStream需要的缓冲所有东西都进入记忆,这会吃掉空间。既然你不需要做那个缓冲,不要!

如果您正在使用最新的POI夜间版本,那么这很容易。您的代码变成:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage); 

否则,它是非常相似:

File file = new File("C:\\D\\Data Book.xlsx"); 
OPCPackage opcPackage = OPCPackage.open(file.getAbsolutePath()); 
XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);