4

我遇到了很奇怪的问题,希望你能帮助我: 我运行以下行:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream(SOME_PATH);

它有效。然后,我创建一个指向同一个文件的新类加载器,然后

this.getClass().getClassLoader().getResourceAsStream(SOME_PATH)

返回空值。

当我调试它时,我看到了

this.getClass().getClassLoader().getResource(SOME_PATH)

返回一个有效的 URL 对象。

所以,我调试了getResourceAsStream,发现它调用了getResource,当它试图打开steam时——它在FileNotFoundException上失败了。

我不知道如何解决它。流已正确关闭。

任何人?

4

2 回答 2

2

ClassLoader.getResourceAsStream()将尝试获取URL资源并执行resource.openStream().

它吞下任何IOException并返回 a null。如果您得到一个FileNotFoundException,则意味着该资源一开始就没有被发现。

要对此进行测试,请尝试:

URL resource = this.getClass().getClassLoader().getResource(SOME_PATH);
if (resource != null) {
    try {
        resource.openStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如果您收到任何内容,IOExceptionClassLoader.getResource()可能找不到资源或无法打开流。

我希望这有帮助。

于 2013-01-10T15:14:41.303 回答
1

我找到了解决方法(注意 setUseCaches):

        InputStream zipStream = null;
        URL resource = this.getClass().getClassLoader().getResource(SOME_PATH);
        if (resource != null) {
            try {
                URLConnection urlConnection = resource.openConnection();
            urlConnection.setUseCaches(false);
                zipStream = urlConnection.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
                NolioAction._log.error(e.getMessage(), e);
            }
        }
于 2013-01-10T16:03:34.850 回答