簡體   English   中英

在OSGi環境中使用OPCPackage從類路徑加載文件

[英]Load file from classpath using OPCPackage in OSGi environment

我正在嘗試加載一個相當大的.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 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

關於如何從捆綁環境中引用我的文件以便加載它的任何想法? 或者我錯過了一些明顯的東西?

如果無法處理輸入流,則可以將輸入流復制到捆綁數據區域中的文件,然后處理該文件。

捆綁包中的資源不會獨立於文件系統,因此如有必要,您需要將它們“提取”到文件中。

如果您只需要Excel文件中的一些部分,您還可以使用Apache POI的流式API ,這樣您就不需要將文件存儲在臨時磁盤空間中,並且可以處理任意大型文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM