使用相对路径在JAR中读取文件


问题内容

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

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

当我在eclipse中本地运行它时,此方法有效,尽管我确实必须进行破解以处理路径名中的空间。配置文件与上述方法位于同一软件包中。但是,当我将应用程序导出为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:URI,也不应自己使用URL进行文件转换,而应使用new File(url.toURI())。这也适用于其他有问题的字符。