如何快速加载大约150个静态ImageIcon对象.每个1KB



在一个静态类和类似的语句中,我有大约150个gif(都很小=1KB)

public final static ImageIcon I_ADDFAV = new ImageIcon("icons/addfavorite.gif");
public final static ImageIcon I_AUTO_LOAD = new ImageIcon("icons/auto_load.gif");
...

我用它们来显示带有图标的JButton。在应用程序启动期间,我注意到与这些语句相关的加载时间增加了约2秒。我想知道是否有人知道加载这些礼物的更快方法。我在想,在一个文件中无限地将所有这些文件都放在一个单独的文件中可能是一种方式,因为我怀疑从光盘中读取150个小文件是实际的延迟。但我可能错了。有没有人有一个聪明的想法,或者曾经处理过这种情况?我们想把它降到毫秒。

欢呼ioannis

我建议将所有图像合并到一个文件中,就像网站应该将所有图像请求合并到一堆精灵的单个请求中一样。从磁盘加载文件所花费的几乎所有时间都花在寻道时间(将磁头移动到磁盘上的正确磁道)和旋转延迟(等待磁盘旋转,使磁头位于正确的位上)上。因此,从磁盘读取一个大文件的时间基本上与从磁盘读取许多小文件的时间相同,一旦大图像在内存中,您就可以拆开所有精灵并在按钮上显示它们。

一个常见的技巧是使用磁贴图像,这样您只需点击磁盘一次。这方面的一个例子是Google(或者Stack Overflow)用于此目的的图像。在web应用程序中,使用CSS背景属性对单个图标进行切片和切割(图像本身使用未来的缓存到期)。

在Java中,您可能使用的一种方法是使用BufferedImagegetSubImage(int,int,int,int)方法,通过快速的内存访问提取所有单独的图标,然后创建这些图标的ImageIcon并将它们放在按钮上。

我想回答这个问题。我使用了上面的想法,并将加载时间减少到毫秒。为了感兴趣的读者的利益:

1) 我整理了我所有的GIF。2) 我用复制/B将它们连接成一个GIF3) 我用编辑器标记了合并文件中每个GIF的开始4) 我使用RandomAccessFile.readFully加载了文件,并读取了每个文件的字节5) 然后,我使用ImageIcon(字节)将应用程序的图标与读取的字节相关联。

就表现而言,最终结果非常令人满意。

感谢

最新更新