3

次の問題があります。

<p:graphicImage>Primefacesの を使用して webapp に画像を表示しています

表示されるイメージは、Bean によって として配信されますDefaultStreamedContent。私のアプリケーションでは、実行時にこのように表示された画像を削除することがあります。

画像を削除できるようになるまで、これには常に少し時間がかかります。少しデバッグした後Files.delete、Java 7 を使用したところ、次の例外が発生しました。

The process cannot access the file because it is being used by another process.

したがって、Primefaces がDefaultStreamedContent表示後にすぐにストリームを閉じていないと思われ、いつでもファイルを削除できません。

を読んだ直後に閉じるように指示する方法はありますかDefaultStreamedContent(私はすでにドキュメントを調べて、 内に適切なメソッドを見つけられませんでしたDefaultStreamedContentが、おそらくストリームなどに伝えることができますか?)

4

1 に答える 1

5

Unlockerわかりました、ツールを使用して何が起こっているのかがようやくわかりました

(ここからダウンロードできます: http://www.emptyloop.com/unlocker/#download )

java.exeファイルが表示されると、ファイルがロックされていることがわかりました。そのため、読んだ後すぐにStream後ろを閉じることはありません。StreamedContent

私の解決策は次のとおりです。

を拡張するスーパークラスを作成しStreamedContent、入力ストリームを読み取らせ、読み取ったバイトを新しい に「フィード」させましたInputStream。その後、指定されたストリームを閉じて、その背後にあるリソースが再び解放されるようにしました。

クラスは次のようになります。

public class PersonalStreamedContent extends DefaultStreamedContent {

/**
 * Copies the given Inputstream and closes it afterwards
 */
public PersonalStreamedContent(FileInputStream stream, String contentType) {
    super(copyInputStream(stream), contentType);
}

public static InputStream copyInputStream(InputStream stream) {
    if (stream != null) {
        try {
            byte[] bytes = IOUtils.toByteArray(stream);
            stream.close();
            return new ByteArrayInputStream(bytes);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } else {
        System.out.println("inputStream was null");
    }
    return new ByteArrayInputStream(new byte[] {});
}
}

画像が2回取得されることは確かですがPrimefaces、最初に読み込まれたときにのみ閉じられます。最初はこれに気づきませんでした。

これが他の人にも役立つことを願っています:)

于 2013-08-27T12:14:14.003 に答える