将Java资源作为文件访问

时间:2012-05-15 16:39:33

标签: java file resources inputstream

我正在尝试从类路径/ 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复制到文件系统上的文件,然后打开该文件,但我希望这不是必要的。

3 个答案:

答案 0 :(得分:5)

简短的回答是你不能,因为资源不是文件。

如果它想要做的只是从源读取数据(因此它应该采用InputStream),或者库实际上想要执行特定于文件的操作,则第三方库写得很糟糕。

假设这不是库中可以修复的疏忽,你需要自己实际创建一个文件。尝试调用File.createTempFile(),用自己的资源内容填充此文件,然后将此File对象传递给库。 (当然,一旦你完成就删除它。)

答案 1 :(得分:2)

您无法直接访问File的jarred资源。相反,您需要将资源的内容复制到实际文件并将其传递给第三方库(您可以使用InputStream获取的getResourceAsInputStream()

答案 2 :(得分:1)

您可以编写一个由FileInputStreamByte Array支持的ByteBuffer包装器对象,然后将其传递到写得不好的库代码中。

如果您不知道库在File对象上调用了哪些方法,那么这不会很简单,并且需要您编写每个方法的正确实现。

我在类似的情况下做了一次,但我知道调用的子集并且不必正确地实现每个方法。你可能会很幸运,图书馆唯一能做的就是致电.getInputStream()并轻松完成。