使用相对路径在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())
。这也适用于其他有问题的字符。