如何从 Jar/Classpath 创建文件实例

How to Create a File instance from the Jar/Classpath

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

它是一个 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 应用程序可以轻松地从 webapp 根目录加载所有内容,我对为什么 JAR 应用程序的行为不同感到困惑。

附加信息:

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

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

简答:这不是 "File",所以你做不到。

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

备选方案是:

  • 尝试该方法的其他重载版本,InputStreams 是 通常是您的选项,您可以使用此代码加载它:

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

  • 将该文件移出 JAR 并移至 JAR 的同一目录(考虑安全风险)