【问题标题】:Reading resource file within a jar在jar中读取资源文件
【发布时间】:2013-03-29 21:43:37
【问题描述】:

我正在尝试读取 .jar 文件中的初始文本文件。我尝试使用 ClassLoader 加载文件,但没有成功。奇怪的是,这种方式它在 Eclipse 中工作,但它没有作为单独的可执行 jar 文件。

现在我将尝试重现这种情况:

A类:

/**
 * Read initial file.
 *
 * @return initial file
 */
private SomeObject readInitialObject() {
    String path = "object/Welcome.xml";
    File f = new File(path);
    Reader r = new Reader(f);
    SomeObject o = r.read();
    return o;
}

类阅读器:

private File importedFile; 
public void read() {
...
 DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(FileLoader.load(importedFile.
                                                           getPath()));
}

类文件加载器

/**
 * Load input stream.
 *
 * @param path file path
 * @return input stream
 */
public static InputStream load(final String path) {
    InputStream input = FileLoader.class.getResourceAsStream(path);
    if (input == null) {
        input = FileLoader.class.getResourceAsStream("/" + path);
    }

    return input;
}

如果能收到您的建议,我将不胜感激。谢谢!

【问题讨论】:

  • 我认为您的路径中缺少 slas:stackoverflow.com/questions/2552793/…
  • @matheszabi 我不这么认为。
  • 对象目录中的 Welcome.xml 是否存在于您的 jar 中?你得到的确切错误是什么?
  • @Puce 是的,它在对象目录中。错误信息:InputStream 不能为空。
  • 您能检查importedFile.getPath() 返回的内容吗? object/Welcome.xml 还是 object\Welcome.xml?

标签: java


【解决方案1】:

Distributed jar file not picking up my .txt file 为例。

你需要指定相对于你正在使用getResourceAsStream的类的路径

【讨论】:

  • 我正在指定 .jar 文件的绝对路径:/object/Welcome.xml
  • 但是在jar文件里面?那么你需要通过“预先”“导航”到 jar 文件的根目录/为每个目录/包嵌套 Fileloader 类
  • 你能根据给定的情况解释一下吗?
  • 您在FileLoader 类中加载文件,对吗?因此,如果该类位于包ba.util 中,则加载文件的正确路径将是"../../object/Welcome.xml";如果它在ba.util.resources 中,则路径需要为"../../../object/Welcome.xml"。你的绝对路径是指操作系统的文件系统。对于 Windows,这通常转换为 C:\object\Welcome.xml
  • 答案是正确的,但只有最后一条评论的附加信息。谢谢!
【解决方案2】:

在 jar 文件中,文件结构与您的实际结构略有不同。您可以打开 jar 以查看文件的确切路径。 另见http://docs.oracle.com/javase/tutorial/deployment/jar/build.html

【讨论】:

    【解决方案3】:

    问题可能是 Windows 不区分大小写,但在 jar 中,文件名区分大小写(如在 Linux 上)。进一步不要使用文件,就像你使用/而不是\一样。

    所以我认为实际的文件有点不同。

    【讨论】:

    • 这不是问题。但我也无法弄清楚实际问题是什么......
    【解决方案4】:

    打开你的jar文件看看你有没有导出文件! -如果否 -> 再次将项目导出到 jar 文件并选择要导出的文件 -如果是 -> 检查文件路径

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 2018-11-24
      相关资源
      最近更新 更多