Я пытаюсь загрузить значки файлов в Windows достаточно эффективно с помощью Java, чтобы они могли отображаться в приложении проводника файлов.
В большинстве случаев значки загружаются примерно через 2-15 миллисекунд, ноиногда для загрузки некоторых файлов один значок может занять до 10 секунд (!).Я просто использую FileSystemView.getFileSystemView().getSystemIcon(File)
.Я также попробовал JIconExtract-library (https://github.com/MrMarnic/JIconExtract),, и, похоже, та же проблема.
import java.io.File;
import javax.swing.filechooser.FileSystemView;
public class Test {
public static void main(String[] args) {
File folder = new File("C:\\Users\\XYZ\\Downloads");
File[] files = folder.listFiles();
for (File file : files) {
long start = System.currentTimeMillis();
FileSystemView.getFileSystemView().getSystemIcon(file);
long end = System.currentTimeMillis();
System.out.println(file.getName() + ": " + (end - start));
}
}
}
Пример вывода из "медленного прогона":
story.ni: 4
StructuredXmlEditor.exe: 96
stone_soup-0.21.1-win32-installer.exe: 798
stone_soup-0.21.1-console-win32.zip: 708
star.png: 2
StageUtils.java.zip: 2
SS2Tool-v.6.1.1.6.exe: 9268
Squiffy.5.1.1.Windows.exe: 10535
square.ttf: 1272
Spit_Splat-Mike_Koenig-1170500447.wav: 4
spelv104.exe: 31
spelv107.rar: 32
Speedy.zip: 2
Похоже, что Windows также кэширует значки или что-то в этом роде, поскольку последующие запуски выполняются очень быстро - в течение некоторого времени.
Почему загрузка значков может занять до 10 секунд? Какой механизм потоков можно использовать для преодоленияэта проблема? В настоящее время я использую просто ExecutorService с несколькими потоками, но если загрузка одного значка может занять до 10 секунд, то мои потоки остановятся, и я довольно долго буду видеть множество файлов без значков.(Я не очень опытен с многопоточностью)