为了账号安全,请及时绑定邮箱和手机立即绑定

从jar中读取资源文件

从jar中读取资源文件

湖上湖 2019-05-29 15:35:54
从jar中读取资源文件我想从我的jar中读取资源,如下所示:File file;file = new File(getClass().getResource("/file.txt").toURI());BufferredReader reader = new BufferedReader(new FileReader(file)); //Read the file并且它在Eclipse中运行时工作正常,但是如果我将它导出到jar中运行它就会出现IllegalArgumentException:Exception in thread "Thread-2"java.lang.IllegalArgumentException: URI is not hierarchical而且我真的不知道为什么,但经过一些测试我发现如果我改变了file = new File(getClass().getResource("/file.txt").toURI());至file = new File(getClass().getResource("/folder/file.txt").toURI());然后它的工作正好相反(它适用于jar而不是eclipse)。我正在使用Eclipse,我的文件夹在一个类文件夹中。
查看完整描述

4 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

而不是尝试将资源作为文件来处理,而只是要求ClassLoader通过getResourceAsStream返回资源的InputStream

InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in));

只要file.txt资源在类路径上可用,那么无论file.txt资源是在classes/目录中还是在内部,这种方法都将以相同的方式工作jar

之所以URI is not hierarchical发生这种情况,是因为jar文件中资源的URI看起来像这样:file:/example.jar!/file.txt。您无法读取jarzip文件)中的条目,就像它是一个普通的旧文件

这可以通过以下答案得到很好的解释:


查看完整回答
反对 回复 2019-05-29
?
梵蒂冈之花

TA贡献1900条经验 获得超5个赞

要访问jar中的文件,您有两个选择:

  • 将文件放在与包名匹配的目录结构中(在解压缩.jar文件后,它应该与.class文件位于同一目录中),然后使用 getClass().getResourceAsStream("file.txt")

  • 将文件放在根目录下(在解压缩.jar文件后,它应该在根目录中),然后使用它来访问它 Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")

当jar用作插件时,第一个选项可能不起作用。


查看完整回答
反对 回复 2019-05-29
?
慕容3067478

TA贡献1773条经验 获得超3个赞

如果你想读作文件,我相信仍有类似的解决方案:

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("file/test.xml").getFile());


查看完整回答
反对 回复 2019-05-29
?
炎炎设计

TA贡献1808条经验 获得超4个赞

之前我遇到过这个问题,我做了后备加载方式。基本上第一种方式在.jar文件中工作,第二种方式在eclipse或其他IDE中工作。

public class MyClass {
    public static InputStream accessFile() {
        String resource = "my-file-located-in-resources.txt";
        // this is the path within the jar file
        InputStream input = MyClass.class.getResourceAsStream("/resources/" + resource);
        if (input == null) {
            // this is how we load file within editor (eg eclipse)
            input = MyClass.class.getClassLoader().getResourceAsStream(resource);
        }
        return input;
    }}


查看完整回答
反对 回复 2019-05-29
  • 4 回答
  • 0 关注
  • 1472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信