我正在尝试从类路径/ 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复制到文件系统上的文件,然后打开该文件,但我希望这不是必要的。
答案 0 :(得分:5)
简短的回答是你不能,因为资源不是文件。
如果它想要做的只是从源读取数据(因此它应该采用InputStream
),或者库实际上想要执行特定于文件的操作,则第三方库写得很糟糕。
假设这不是库中可以修复的疏忽,你需要自己实际创建一个文件。尝试调用File.createTempFile()
,用自己的资源内容填充此文件,然后将此File
对象传递给库。 (当然,一旦你完成就删除它。)
答案 1 :(得分:2)
您无法直接访问File
的jarred资源。相反,您需要将资源的内容复制到实际文件并将其传递给第三方库(您可以使用InputStream
获取的getResourceAsInputStream()
)
答案 2 :(得分:1)
您可以编写一个由File
,InputStream
或Byte Array
支持的ByteBuffer
包装器对象,然后将其传递到写得不好的库代码中。
如果您不知道库在File
对象上调用了哪些方法,那么这不会很简单,并且需要您编写每个方法的正确实现。
我在类似的情况下做了一次,但我知道调用的子集并且不必正确地实现每个方法。你可能会很幸运,图书馆唯一能做的就是致电.getInputStream()
并轻松完成。