如何从Jar/Classpath创建一个File实例



我有一个可执行的JAR,其中有一个文件,我想从代码(不是InputStream或其他任何东西)中打开java.io.File实例…只是文件)。

这是一个maven项目,文件位于"src/main/resources/file.xxx"的根目录下。打包后,该文件位于jar的根目录(已确认在那里)。

我的第一次尝试:FileNotFoundException

java.io.File myFile = new java.io.File("file.xxx");
someMethodThatUsesTheFile(myFile); //I really need it to be a file!!!

其他尝试:FileNotFoundException

java.io.File myFile = new java.io.File("/file.xxx");
java.io.File myFile = new java.io.File("classpath:file.xxx");
java.io.File myFile = new java.io.File("classpath:/file.xxx");

我不确定到底发生了什么。Web应用程序可以很容易地从Web应用程序根目录加载所有内容,我很困惑为什么JAR应用程序的行为不同。

额外的信息:

    使用Java8作为运行时/build
  • 命令运行JAR: "java -jar myjar.jar"
  • 应用程序代码和文件都位于同一个jar

简短的回答:它不是一个"文件",所以你不能这样做。

JAR文件是一个文件,但不是它的内容。

可选:

  • 尝试该方法的其他重载版本,InputStreams是通常在你的选项中,你可以使用下面的代码来加载它:

    InputStream is = getClass().getResourceAsStream("file.xxx");

  • 将该文件移出JAR并放入与JAR相同的目录中(考虑安全风险)

试试这个可能对你有帮助:

URL url = this.getClass().getResource("src/main/resources/file.xxx");
File file= new File(url.toURI());

相关内容

最新更新