我正在加載將在我的應用程序中使用的圖標。我計劃在服務器啓動時從jar中加載它們。但是,有數百張圖片加起來只有9MB,但它仍然需要30多秒來完成這項任務。我現在正在一個單獨的線程中執行它,但它讓我懷疑在代碼中是否無效地做了某些事情。我借用了SO的代碼將信息加載到我的結構中。我將代碼放入測試類並對其進行分析。該配置文件的99%位於ImageIO.read(..)方法中。所以這絕對是瓶頸。下面是應該提供關於我如何使用ImageIO的圖片的測試類。ImageIO.read(...) - 速度很慢,有沒有更好的方法?
public class IconTest {
/**
* @param args the command line arguments
* @throws java.net.URISyntaxException
* @throws java.io.IOException
*/
public static void main(String[] args) throws URISyntaxException, IOException {
URI uri = IconTest.class.getResource("Icons").toURI();
Path myPath;
if (uri.getScheme().equals("jar")) {
FileSystem fileSystem = FileSystems.newFileSystem(uri, Collections.<String, Object>emptyMap());
myPath = fileSystem.getPath("Icons/");
} else {
myPath = Paths.get(uri);
}
IconFolder root = new IconFolder(myPath.toFile().getName());
IconFolder parentFolder = root;
HIcon currentIcon = null;
IconFolder folder = null;
HashMap<String,IconFolder> folders = new HashMap<>();
folders.put(parentFolder.getName(), parentFolder);
Stream<Path> walk = Files.walk(myPath, 5);
Iterator<Path> it = walk.iterator();it.next();
while(it.hasNext()){
Path path = it.next();
if(path.toFile().isDirectory()){
folder = new IconFolder(path.toFile().getName());
folders.put(folder.getName(), folder);
String parentName = path.getParent().toFile().getName();
parentFolder = folders.get(parentName);
parentFolder.addSubFolder(folder);
currentIcon =null;
System.out.println("Directory: " + path);
}else{
URL url = path.toUri().toURL();
ImageIcon icon = new ImageIcon(ImageIO.read(url));
//Image image = Toolkit.getDefaultToolkit().getImage(url);
//ImageIcon icon = new ImageIcon(image);
String[] iconName;
iconName = path.getFileName().toString().replaceAll("_000000", "").replaceAll(".png","").split("_",2);
String imageName = iconName[0];
String imageSize = iconName[1];
if(currentIcon==null||!currentIcon.getName().equals(imageName)){
currentIcon = new HIcon(imageName);
folder.addIcon(currentIcon);
currentIcon.setIcon(icon, imageSize);
}else{
currentIcon.setIcon(icon, imageSize);
}
//System.out.println("Image: " + imageName+"-->"+imageSize);
}
}
System.out.println("");
}
}
任何指針都會有幫助。我看了很多SO帖子,我認爲這些帖子都指出了同樣的事情。我正在使用帶有SSD的MacBook Air,所以我認爲這將會閃電般快速。
我加了下面的輪廓結果的截圖:
這是設置setUseCache
假後的輪廓:
我會質疑整個策略。我會加載他們,因爲你需要他們。分散痛苦。 – EJP
將圖標放在一張圖像中並稍後將它們剪下可能會大大加快。從罐子裏讀取的100個圖像可能是低效的。 – pvg
@pvg - 請參閱我對以下答案的評論。將它們放入zip文件,將1個文件加載到內存中然後執行我的步行和在內存中讀取? – Mark