函数getResourceAsStream返回null,而getResource返回一个URL

时间:2013-01-10 13:46:36

标签: java

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

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

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

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

返回null。

当我调试它时,我看到了

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

返回有效的URL对象。

所以,我调试了getResourceAsStream,看到它调用了getResource,当它试图打开steam时 - 它在FileNotFoundException上失败。

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

任何?

2 个答案:

答案 0 :(得分:2)

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

它吞下任何IOException并返回null。如果您获得FileNotFoundException,则表示首先找不到资源。

要测试此功能,请尝试:

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

如果您收到任何IOException,则ClassLoader.getResource()找不到资源或无法通过某种机会打开该资源。

我希望这会有所帮助。

答案 1 :(得分: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);
            }
        }