访问.jar文件中的文件

15

可能是重复问题:
如何从Java jar文件中读取资源文件?

在搜索了几个小时后,我因为这个问题完全疯了。我也看到了站点上的问题变体,但似乎无法让它正常工作。一个JFrame需要从一个ini文件中读取数据,我创建了一个打开该文件的方法。该文件存储在jar文件内部的名为"resources"的文件夹中。

private BufferedReader openIniFile(String filename){
    BufferedReader brReader = null;                 
    try{
        File fileObj = new File(this.getClass().getResource("/resources/" + filename).toURI()); // The fileobject of the file to read
        if(fileObj.exists())                                            
            brReader = new BufferedReader(new FileReader(fileObj));                     

    } catch(Exception e){
        System.err.println("Exception while opening file: " + e.getMessage()); 

    }

    return null;
}

当我编译后运行代码时,这当然完全正常,但将其导出为.jar文件后会引发异常。我已经尝试使用InputStream、FileInputStream等方法,但似乎找不到可行的解决方案。

我该如何使jar文件能够识别该资源?


我尝试过了,但无法让它工作 :( - Chrizmo
“无法使其正常工作”并没有太大帮助。 - David Heffernan
抱歉,它仍然会抛出空异常。 - Chrizmo
6
“couldn't get it working” doesn't help much 的意思是“无法让它工作起来”,但这句话并没有提供太多帮助。 - Michael
2个回答

23

当你的资源存储在JAR文件中时,它不再是一个文件。File只是文件系统上的物理文件。

解决方案:使用getResourceAsStream。像这样:

new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/resources/" + filename)))

但是如果我使用getResourceAsStream,就不能使用File类了,对吧? - Chrizmo
1
没错,它不是一个文件。 - Sean Owen
1
我有一个在资源中的目录,其中包含所有文件。如何浏览目录以访问所有文件,然后使用上述内容? - Ava
简单而有效的解决方案:制作一个包含您的资源或文件的jar文件,然后进行评估。 - Samrez Ikram

6

你读取文件的方式有误。如果文件位于JAR包中,你不能使用File类。相反,你必须使用getResourceAsStream()获取文件的InputStream

InputStream in = this.getClass().getResourceAsStream("/resources/" + filename);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接