Java Jar 文件:使用资源错误:URI 不是分层的

2022-08-31 13:09:21

我已将我的应用部署到 jar 文件。当我需要将数据从一个资源文件复制到jar文件外部时,我会执行以下代码:

URL resourceUrl = getClass().getResource("/resource/data.sav");
File src = new File(resourceUrl.toURI()); //ERROR HERE
File dst = new File(CurrentPath()+"data.sav");  //CurrentPath: path of jar file don't include jar file name
FileInputStream in = new FileInputStream(src);
FileOutputStream out = new FileOutputStream(dst);
 // some excute code here

我遇到的错误是:。在IDE中运行时,我遇到此错误。URI is not hierarchical

如果我将上面的代码作为StackOverFlow上其他帖子的一些帮助:

InputStream in = Model.class.getClassLoader().getResourceAsStream("/resource/data.sav");
File dst = new File(CurrentPath() + "data.sav");
FileOutputStream out = new FileOutputStream(dst);
//....
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) { //NULL POINTER EXCEPTION
  //....
}

答案 1

您不能这样做

File src = new File(resourceUrl.toURI()); //ERROR HERE

它不是一个文件!当你从ide运行时,你没有任何错误,因为你没有运行jar文件。在 IDE 中,类和资源在文件系统上提取。

但是你可以通过以下方式打开:InputStream

InputStream in = Model.class.getClassLoader().getResourceAsStream("/data.sav");

删除。通常,IDE 在文件系统类和资源上是分开的。但是当创建罐子时,它们被放在一起。因此,文件夹级别仅用于类和资源分离。"/resource""/resource"

当你从类装入器获取资源时,你必须指定资源在jar中的路径,即真正的包层次结构。


答案 2

如果由于某种原因,您确实需要创建一个对象来指向Jar文件中的资源,那么答案就在这里:https://stackoverflow.com/a/27149287/155167java.io.File

File f = new File(getClass().getResource("/MyResource").toExternalForm());

推荐