Java 在OSGi环境中使用OPCPackage从类路径加载文件

Java 在OSGi环境中使用OPCPackage从类路径加载文件,java,osgi,apache-poi,classloader,osgi-bundle,Java,Osgi,Apache Poi,Classloader,Osgi Bundle,我正在尝试加载一个相当大的.xslx文件(29MB),以便使用POI在Java中进行处理 由于使用InputStream读取内存中的文件时未压缩的文件大小,我遇到了堆空间问题 根据Stackoverflow上的建议,我使用OPCPackage不必将整个文件加载到内存中 我尝试使用OPCPackageopen方法加载文件。此方法接受: 文件 InputStream(无法在InputStream-OutOfMemory中加载文件) 路径 文件选项 问题是,我们在OSGi环境中工作,所以在尝试创建

我正在尝试加载一个相当大的.xslx文件(29MB),以便使用POI在Java中进行处理

由于使用
InputStream
读取内存中的文件时未压缩的文件大小,我遇到了堆空间问题

根据Stackoverflow上的建议,我使用
OPCPackage
不必将整个文件加载到内存中

我尝试使用
OPCPackage
open方法加载文件。此方法接受:

  • 文件
  • InputStream(无法在InputStream-OutOfMemory中加载文件)
  • 路径
文件选项 问题是,我们在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方案不是“文件”

尝试改用URL路径也不成功:

File file = new File(url.getPath()); // Path= /excel/file.xslx
if(!file.exists()){
    // FILE DOES NOT EXIST
}
路径选项 当我尝试使用path open方法时,它似乎无法解析路径,因为我总是遇到以下异常:
java.lang.IllegalStateException:Zip文件已关闭

opcPackage = OPCPackage.open(url.toURI().getPath()); // Path= /excel/file.xslx

关于如何从捆绑包环境中引用文件以便加载它,有什么想法吗?还是我遗漏了一些明显的东西

如果无法处理输入流,则可以将输入流复制到bundle数据区域中的文件,然后处理该文件


捆绑包中的资源在文件系统中并不独立,因此如果需要,您需要将其“提取”到文件中。

如果您只需要Excel文件中的几部分,您还可以使用Apache POI,这样您就不需要将文件存储在临时磁盘空间中,并且可以处理任意大的文件。

Hi BJ,这就是我在问了这个问题之后开始实现它的方式。谢谢你的确认!