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

Jon*_*nah 6 java jar getresource

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

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

当我在eclipse中本地运行它时,这可以工作,尽管我必须做那个hack来处理路径名中的空间.配置文件与上述方法位于同一个包中.但是,当我将应用程序导出为jar时,我遇到了问题.jar存在于共享的映射网络驱动器Z:上.当我从命令行运行应用程序时,我收到此错误:

java.io.FileNotFoundException:file:\ Z:\ apps\jar\apps.jar!\ vp\fsm\configs\wof.txt

我怎样才能使这个工作?我只想告诉java读取与当前类相同的目录中的文件.

谢谢,约拿

Paŭ*_*ann 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"));
Run Code Online (Sandbox Code Playgroud)

而不是"UTF-8"使用文件实际使用的编码(即您在编辑器中使用的编码).


另一点:即使您只有file:URI,也不应该自己进行文件转换的URL,而是使用new File(url.toURI()).这适用于其他有问题的角色.

  • new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("wof.txt"))) (3认同)