【问题标题】:Reading File In JAR using Relative Path使用相对路径读取 JAR 中的文件
【发布时间】:2011-06-30 13:53:46
【问题描述】:

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

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读取与当前类在同一目录中的文件。

谢谢, 约拿

【问题讨论】:

    标签: java jar getresource


    【解决方案1】:

    当文件在 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,而是使用new File(url.toURI())。这也适用于其他有问题的角色。

    【讨论】:

    • 保罗,谢谢。问题是我最终需要获得一个 BufferedReader。如果我使用 getResourceAsStream(),我该怎么做?
    • new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("wof.txt")))
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 2023-03-09
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多