我有一些文本配置文件需要我的程序读取。我当前的代码是:
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/