Teo*_*Teo 4 java caching bufferedimage
我的应用基本上是一个照片浏览器.我的做法(不要评判我,我是java新手)是要ArrayList填充BufferedImages然后将图像添加到JList(向左).
这是我得到一个图像的方式:
private void getFullImage() {
BufferedImage im = null;
ImageReader imageReader = null;
try {
System.out.println("Loading "+original+"...");
String suffix = Utils.getFileExt(original.getName(), "jpg");
@SuppressWarnings("rawtypes")
Iterator readers = ImageIO.getImageReadersBySuffix(suffix);
imageReader = (ImageReader)readers.next();
imageReader.setInput(new FileImageInputStream(original));
im = imageReader.read(0);
imageReader.dispose();
} catch (Exception e)
{
e.printStackTrace();
}
this.img = im;
}
Run Code Online (Sandbox Code Playgroud)
然后,在我获取所有数据后,我会将图像添加到我的JList:
Vector vector = new Vector();
JPanel container = null;
PhotoPanel pp = null;
Photo p = null;
for(int i=0;i<files.length;i++)
{
p = new Photo(files[i]);
pp = new PhotoPanel(p);
container = new JPanel(new BorderLayout());
container.add(pp,BorderLayout.CENTER);
container.setBorder(BorderFactory.createTitledBorder(p.getTitle()));
vector.addElement(container);
}
plist.setListData(vector);
Run Code Online (Sandbox Code Playgroud)
如果我有10个文件,该应用程序运行良好.问题是我有更多的图像要显示.然后我会得到一个例外:Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space.所以,我知道我的方法非常糟糕,我想知道如何拍摄和存储所有图像并让它们显示在图像中JList.也许使用缓存?我读过一些关于SoftReference但我真的不知道如何使用它的内容.谢谢.
导致此问题的原因主要有两个:
第一个,我发布的更多是警告,而不是在你的情况下作为一个实际原因,是在控制台上打印过多的数据System.out.println().
我不确定它是仅在NetBeans或所有开发工具中发生的.但不管怎样,它需要一个真正荒谬的打印量来触发它,我怀疑你有很多文件加载.
无论如何,如果您对该System.out.println("Loading "+original+"...");行的意图是永久性/生产日志记录,而不是为了开发/调试目的而暂时放置代码,那么您最好使用正确的Logger.您可以在本SO答案中阅读TL; DR版本的说明,您可以通过其中提供的链接进一步阅读,包括官方文档.
另一个原因,当然是您的原因,就是您同时加载了太多数据.解决方案是:
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |