使用相对路径在JAR中读取文件
我有一些需要我的程序读取的文本配置文件。 我目前的代码是:
protected File getConfigFile() { URL url = getClass().getResource("wof.txt"); return new File(url.getFile().replaceAll("%20", " ")); }
当我在eclipse中本地运行它时,这可以工作,尽管我确实需要做那个hack来处理路径名中的空间。 配置文件与上述方法位于同一个包中。 但是,当我将应用程序导出为jar时,我遇到了问题。 jar存在于共享的映射网络驱动器Z:上。 当我从命令行运行应用程序时,我收到此错误:
java.io.FileNotFoundException:file:\ Z:\ apps \ jar \ apps.jar!\ vp \ fsm \ configs \ wof.txt
我怎样才能使这个工作? 我只想告诉java读取与当前类相同的目录中的文件。
谢谢,约拿
当文件在jar中时,您不能使用File
类来表示它,因为它是一个jar:
URI。 相反,URL类本身已经为您提供了openStream()
读取内容的可能性。
或者您可以使用getResourceAsStream()
而不是getResourceAsStream()
来快捷方式。
要获得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())
。 这适用于其他有问题的角色。