java - 使用相对路径读取 JAR 中的文件

标签 java jar getresource

我有一些文本配置文件需要我的程序读取。我当前的代码是:

protected File getConfigFile() {
    URL url = getClass().getResource("wof.txt");
    return new File(url.getFile().replaceAll("%20", " "));
}

当我在 eclipse 中本地运行它时,这有效,尽管我确实必须进行 hack 处理路径名中的空格。配置文件与上述方法在同一个包中。但是,当我将应用程序导出为 jar 时,我遇到了问题。该 jar 存在于共享的映射网络驱动器 Z: 中。当我从命令行运行应用程序时出现此错误:

java.io.FileNotFoundException: 文件:\Z:\apps\jar\apps.jar!\vp\fsm\configs\wof.txt

我怎样才能让它工作?我只是想告诉 java 读取与当前类相同目录中的文件。

谢谢, 约拿

最佳答案

当文件在 jar 中时,您不能使用 File 类来表示它,因为它是一个 jar: URI。相反,URL 类本身已经为您提供了 openStream() 读取内容的可能性。

或者您可以使用 getResourceAsStream() 而不是 getResource() 来简化此操作。

要获得 BufferedReader(更易于使用,因为它具有 readLine() 方法),请使用通常的流包装:

InputStream configStream = getClass().getResourceAsStream("wof.txt");
BufferedReader configReader = new BufferedReader(new InputStreamReader(configStream, "UTF-8"));

使用文件实际使用的编码(即您在编辑器中使用的编码)代替“UTF-8”。


还有一点:即使你只有file: URIs,你也不应该自己做URL到File的转换,而是使用new File(url.toURI())。这也适用于其他有问题的角色。

关于java - 使用相对路径读取 JAR 中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054435/

相关文章:

java - JDK 9 不安全导入 sun.misc.Launcher

android - getDrawable 返回 null

java - Weblogic 错误 : Caused by: weblogic. transaction.internal.AppSetRollbackOnlyException:在事务上调用 setRollbackOnly

java - 在构造函数上注入(inject) java.util.Random

java - 如何在 JAR 文件之外读取或写入 .properties 文件

java - 无法在我的可执行 jar 中包含外部 jar

java - srcs 和非 srcs jar 之间的区别?

java - class.getResource (".") 返回 null

java - Apache Kafka 是否在 Open JDK 上运行

java - 基于参数的类的新实例