我有以下问题:
我使用Primefaces 的<p:graphicImage>
在我的网络应用程序中显示图像
所显示的图像由bean作为DefaultStreamedContent
进行传递。在我的应用程序中,我有时会删除运行时以这种方式显示的图像。
这总是需要一点时间,直到我可以删除图像。经过一点调试,我使用了Java7的Files.delete
,得到了以下异常:
The process cannot access the file because it is being used by another process.
因此,我怀疑Primefaces在显示后没有立即关闭DefaultStreamedContent
后面的流,并且我无法随时删除该文件。
有没有办法告诉DefaultStreamedContent
在阅读后立即关闭自己(我已经查看了文档,在DefaultStreamedContent
中没有找到任何合适的方法,但也许可以告诉流或类似的东西?)
好的,我终于发现了使用Unlocker
工具发生了什么
(可在此处下载:http://www.emptyloop.com/unlocker/#download)
我看到java.exe
在文件显示后锁定了它。因此CCD_ 10后面的CCD_。
我的解决方案如下:
我制作了一个扩展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[] {});
}
}
我确信Primefaces
检索了2次图像,但仅在第一次加载时关闭。我一开始没有意识到这一点。
我希望这也能帮助其他人:)