【问题标题】:Loading file from resource gives a wrong path [duplicate]从资源加载文件给出了错误的路径[重复]
【发布时间】:2016-05-20 13:47:38
【问题描述】:

我有一个属性文件,其中包含我的 jar 中文件的路径

logo.cgp=images/cgp-logo.jpg

此文件已存在:

我想在我的项目中加载这个文件,所以我这样做:

String property = p.getProperty("logo.cgp"); //This returns "images/cgp-logo.jpg"
File file = new File(getClass().getClassLoader().getResource(property).getFile());

但是当我执行file.exists() 时,我得到false。当我检查file.getAbsolutePath() 时,它会导致C:\\images\\cgp-logo.jpg

我做错了什么?

【问题讨论】:

    标签: java jar


    【解决方案1】:

    您可以像这样使用JarFile 类:

    JarFile jar = new JarFile("foo.jar");
    String file = "file.txt";
    JarEntry entry = jar.getEntry(file);
    InputStream input = jar.getInputStream(entry);
    OutputStream output = new FileOutputStream(file);
    try {
        byte[] buffer = new byte[input.available()];
        for (int i = 0; i != -1; i = input.read(buffer)) {
            output.write(buffer, 0, i);
        }
    } finally {
        jar.close();
        input.close();
        output.close();
    }
    

    【讨论】:

      【解决方案2】:

      jar 中的文件只是不是普通文件。它是一种可以由 ClassLoader 加载并作为流而不是文件读取的资源。

      根据 Javadocs,getClass().getClassLoader().getResource(property) 在 URL 上返回 URLgetFile()

      获取此 URL 的文件名。返回的文件部分将与 getPath() 相同,加上 getQuery() 值的串联(如果有)。如果没有查询部分,此方法和 getPath() 将返回相同的结果。

      因此对于 jar 资源,它与返回的 getPath() 相同:

      此 URL 的路径部分,如果不存在则为空字符串

      所以在这里你会得到/images/cgp-logo.jpg 相对于类路径 它不对应于你文件系统上的真实文件。这也解释了file.getAbsolutePath()的返回值

      获取资源的正确方法是:

      InputStream istream =  getClass().getClassLoader().getResourceAsStream(property)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多