簡體   English   中英

將Java資源作為文件訪問

[英]Accessing a Java Resource as a File

我正在嘗試從類路徑/ JAR文件中訪問資源作為File對象。 我知道它是使用InputStream對象的首選方法,但我使用的是需要File對象的外部庫(WorldEdit)。

這是我的代碼:

InputStream templStream = "".getClass().getResourceAsStream("/res/template.prom");
System.out.println("templateStream: " + templStream.toString());
File templFile = new File("".getClass().getResource("/res/template.prom").toURI());
System.out.println("templateFile: " + templFile.canRead());

現在,當我還在Eclipse中時,訪問資源的兩種方式都可以完美地工作並產生這樣的輸出:

templStream: java.io.BufferedInputStream@746d1683
templFile: true

但是在將代碼導出到JAR存檔后,代碼將失敗:

templStream: sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@47aa261b
Exception in thread "main" java.lang.IllegalArgumentException: URI is not hierarchical
    at java.io.File.<init>(File.java:392)
    at SMCToPROM.main(SMCToPROM.java:101)

所以我一直沒有成功地尋找一種方法來直接訪問資源作為文件,或者使用InputStream並將該InputStream轉換為文件。

最糟糕的情況是回退解決方案是將InputStream復制到文件系統上的文件,然后打開該文件,但我希望這不是必要的。

簡短的回答是你不能,因為資源不是文件。

如果它想要做的只是從源讀取數據(因此它應該采用InputStream ),或者庫實際上想要執行特定於文件的操作,則要么編寫第三方庫。

假設這不是庫中可以修復的疏忽,你需要自己實際創建一個文件。 嘗試調用File.createTempFile() ,自己用資源的內容填充此文件,然后將此File對象傳遞給庫。 (當然,一旦你完成就刪除它)。

您不能直接以File訪問jarred資源。 相反,您需要將資源的內容復制到實際文件並將其傳遞給第三方庫(您可以使用從getResourceAsInputStream()獲取的InputStream

您可以編寫一個由InputStreamByte ArrayByteBuffer支持的File包裝器對象,然后將其傳遞給編寫得很糟糕的庫代碼。

這並不簡單,如果您不知道庫在File對象上調用了哪些方法,則需要編寫每個方法的正確實現。

我在類似的情況下做了一次,但我知道調用的子集,並沒有正確實現每個方法。 你可能會很幸運,圖書館唯一能做的就是調用.getInputStream()並輕松完成。

暫無
暫無

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

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