在 OSGi 环境中使用 OPCPackage 从类路径加载文件
Load file from classpath using OPCPackage in OSGi environment
我正在尝试加载一个相当大的 .xslx 文件 (29MB) 以使用 POI 在 Java 中处理。
由于使用 InputStream
读取内存中的文件时未压缩的文件大小,我 运行 进入堆 space 问题。
根据 Whosebug 上的建议,我使用 OPCPackage
不必将整个文件加载到内存中。
我尝试使用 OPCPackage
打开方法加载文件。此方法接受:
- 文件
InputStream(无法在输入流中加载文件 - OutOfMemory)
- 路径
文件选项
问题是我们在 OSGi 环境中工作,因此在尝试使用资产路径创建文件时。资产路径实际上是 link 到 bundle
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
关于如何从捆绑环境中引用我的文件以加载它的任何想法?还是我在这里遗漏了一些明显的东西?
如果您无法处理输入流,那么您可以将输入流复制到包数据区中的一个文件,然后处理该文件。
捆绑包中的资源在文件系统上并不独立,因此如果需要,您需要将它们 "extract" 到一个文件中。
如果你只需要Excel文件中的几段,你也可以使用Apache POI的streaming API,这样你就不需要将文件存储在临时磁盘中-space 并且你可以处理任意大文件。
我正在尝试加载一个相当大的 .xslx 文件 (29MB) 以使用 POI 在 Java 中处理。
由于使用 InputStream
读取内存中的文件时未压缩的文件大小,我 运行 进入堆 space 问题。
根据 Whosebug 上的建议,我使用 OPCPackage
不必将整个文件加载到内存中。
我尝试使用 OPCPackage
打开方法加载文件。此方法接受:
- 文件
InputStream(无法在输入流中加载文件 - OutOfMemory)- 路径
文件选项
问题是我们在 OSGi 环境中工作,因此在尝试使用资产路径创建文件时。资产路径实际上是 link 到 bundle
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
关于如何从捆绑环境中引用我的文件以加载它的任何想法?还是我在这里遗漏了一些明显的东西?
如果您无法处理输入流,那么您可以将输入流复制到包数据区中的一个文件,然后处理该文件。
捆绑包中的资源在文件系统上并不独立,因此如果需要,您需要将它们 "extract" 到一个文件中。
如果你只需要Excel文件中的几段,你也可以使用Apache POI的streaming API,这样你就不需要将文件存储在临时磁盘中-space 并且你可以处理任意大文件。