Загрузка значков файлов иногда очень медленная, для некоторых файлов - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь загрузить значки файлов в 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 секунд, то мои потоки остановятся, и я довольно долго буду видеть множество файлов без значков.(Я не очень опытен с многопоточностью)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...