6

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

4

3 回答 3

5

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

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

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

于 2012-05-15T16:46:56.717 回答
2

您不能以Files 的身份直接访问 jarred 资源。相反,您需要将资源的内容复制到实际文件并将其传递给 3rd 方库(您可以使用InputStream从中获得getResourceAsInputStream()的)

于 2012-05-15T16:44:29.697 回答
1

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

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

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

于 2012-05-15T17:03:03.290 回答