我正在尝试使用POI加载一个相当大的.xslx文件(29MB)来处理Java。
由于使用InputStream
在内存中读取文件时文件大小未压缩,我遇到了堆空间问题。
根据Stackoverflow的建议,我使用OPCPackage
来不必将整个文件加载到内存中。
我尝试使用OPCPackage
open方法加载文件。此方法接受:
问题是我们正在OSGi环境中工作,因此在尝试使用资产路径创建文件时。资产路径实际上是指向
的链接URL url = getClass().getClassLoader().getResource("/excel/file.xslx");
File file = new File(url.toURI()); // URI = bundle://449.124:/excel/file.xlsx
因此发生以下异常:java.lang.IllegalArgumentException: URI scheme is not "file"
尝试使用URL路径也不成功:
File file = new File(url.getPath()); // Path= /excel/file.xslx
if(!file.exists()){
// FILE DOES NOT EXIST
}
当我尝试使用路径打开方法时,它似乎无法解析路径,因为我总是得到以下异常:java.lang.IllegalStateException: Zip File is closed
opcPackage = OPCPackage.open(url.toURI().getPath()); // Path= /excel/file.xslx
关于如何在捆绑环境中引用我的文件以便加载它的任何想法?或者我错过了一些明显的东西?
答案 0 :(得分:2)
如果无法处理输入流,则可以将输入流复制到捆绑数据区域中的文件,然后处理该文件。
捆绑包中的资源并不是独立于文件系统的,因此如果需要,您需要将它们“提取”到文件中。
答案 1 :(得分:1)
如果您只需要Excel文件中的一些部分,您也可以使用Apache POI的streaming API,这样您就不需要将文件存储在临时磁盘空间中,并且可以处理任意大的文件文件。