将Java资源作为文件访问

mic*_*c_e 5 java resources inputstream 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());
Run Code Online (Sandbox Code Playgroud)

现在,当我还在Eclipse中时,访问资源的两种方式都可以完美地工作并产生这样的输出:

templStream: java.io.BufferedInputStream@746d1683
templFile: true
Run Code Online (Sandbox Code Playgroud)

但是在将代码导出到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)
Run Code Online (Sandbox Code Playgroud)

所以我一直没有成功地寻找一种方法来直接访问资源作为文件,或者使用InputStream并将该InputStream转换为文件.

最糟糕的情况是回退解决方案是将InputStream复制到文件系统上的文件,然后打开该文件,但我希望这不是必要的.

And*_*yle 5

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

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

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