6

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

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

谢谢,乔纳

4

1 回答 1

14

当文件在 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:URI,也不应该自己做 URL 到文件转换,而是使用new File(url.toURI()). 这也适用于其他有问题的角色。

于 2011-02-20T00:33:23.017 回答