[英]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
)
您可以編寫一個由InputStream
, Byte Array
或ByteBuffer
支持的File
包裝器對象,然后將其傳遞給編寫得很糟糕的庫代碼。
這並不簡單,如果您不知道庫在File
對象上調用了哪些方法,則需要編寫每個方法的正確實現。
我在類似的情況下做了一次,但我知道調用的子集,並沒有正確實現每個方法。 你可能會很幸運,圖書館唯一能做的就是調用.getInputStream()
並輕松完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.