4

私は非常に奇妙な問題に遭遇しました。あなたが私を助けてくれることを願っています: 私は次の行を実行します:

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 で失敗することがわかりました。

解決方法がわかりません。ストリームは適切に閉じられています。

誰?

4

2 に答える 2

2

ClassLoader.getResourceAsStream()URLリソースを取得して実行しようとしますresource.openStream()

any を飲み込み、代わりIOExceptionに a を返しますnull。が表示される場合FileNotFoundExceptionは、リソースが最初から見つからなかったことを意味します。

これをテストするには、次を試してください。

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

何かIOExceptionを取得している場合ClassLoader.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 に答える