代码之家  ›  专栏  ›  技术社区  ›  Andreas Dolk

需要帮助解决奇怪的类#getResource()问题吗

  •  4
  • Andreas Dolk  · 技术社区  · 15 年前

    URL url = SomeClass.class.getResource("/configuration.properties");
    // some more code here using url variable
    InputStream in = url.openStream();
    

    显然它以前工作过,但是当我执行这个代码时,URL是有效的,但是我在第三行得到一个IOException,说它找不到文件。url类似于“ file:jar:c:/path/to/jar/somejar.jar!configuration.properties

    上面的代码是ant任务的一部分,在执行任务时失败。

    在某个时刻,我将ant任务的代码改为

    URL url = SomeClass.class.getResource("/configuration.properties");
    // some more code here using url variable
    InputStream in = SomeClass.class.getResourceAsStream("/configuration.properties");
    

    现在它工作了-直到它在另一个实现了类似访问模式的类中崩溃。。

    为什么它以前可以工作,为什么现在失败了?我现在看到的唯一区别是,旧的构建是用Java1.4完成的,而我现在正在用Java6尝试。

    今天我在构建服务器上安装了java1.4.2u19,并让ant使用它。令我完全沮丧的是:问题已经解决了。在我看来,Java1.4.2可以处理这种类型的URL,而Java1.6不能(至少在我的上下文/环境中是这样)。

    我仍然希望得到一个解释,虽然我面临着重写部分代码的工作,以使用类#getressourceastream,它的行为更加稳定。。。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Tom Hawtin - tackline    15 年前

    的典型实现 ClassLoader.getResourceAsStream 是:

    public InputStream getResourceAsStream(String name) {
        URL url = getResource(name);
        try {
            return url != null ? url.openStream() : null;
        } catch (IOException e) {
            return null;
        }
    }
    

    Class.getResource getResourceAsStream 彼此行为相同。

    ClassLoader 或者你这边的测试有错误。

        2
  •  1
  •   helios    15 年前

    它与getresourceasstream一起工作是因为它位于类路径中,但与URL不工作可能是因为URL不正常。

    我不知道getResource创建的URL是不是不正常,或者协议没有正确的处理程序(不是吗 file:jar:c:/myjar.jar!configuration.properties

        3
  •  1
  •   bestsss    14 年前

    您可能希望在useCaches(true)的同时关闭修改过的jar文件,JarURLConnection.getjar文件().关闭()

    有时我希望Jar/Zip的处理更好一点

    干杯

        4
  •  0
  •   jarnbjo    15 年前

    使用包含空格的文件URL时,几个Java版本中都存在错误。”/path/to/jar“可能不是您真正的路径,所以我至少假设这就是您遇到的。你的代码至少在理论上是可以的。