Реализация progress bar в командной строке на Java

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Способ быстрого создания индикатора выполнения – применить метод updateProgressBar(). Этот метод позволяет отобразить динамический индикатор, который демонстрирует прогресс выполнения задач. Результат представлен с высокой степенью точности с помощью String.format, что обеспечивает ясную визуальную обратную связь пользователю.

Java
Скопировать код
public static void updateProgressBar(int done, int total) {
    String format = "\r%3d%% %s %c";
    String icon = "=";
    int width = 50; 
    int progress = (done * width) / total;
    String bar = new String(new char[progress]).replace('\0', icon.charAt(0)) +
                 new String(new char[width – progress]).replace('\0', ' ');
    System.out.printf(format, (done * 100) / total, bar, '|');
}

// Имитация процесса выполнения задачи
for (int i = 0; i <= total; i++) {
    updateProgressBar(i, total);
    Thread.sleep(100); // Здесь происходит выполнение задачи
}

Важные моменты:

  • \r: Возвращает курсор в начало строки, не переходя на новую.
  • %3d%%: Отображает целое число со знаком процента после числа.
  • Вычисление прогресса: Формула (done * width) / total идеально подходит для адаптивного индикатора.
  • Thread.sleep: Необходимо заменить кодом выполнения задачи.
Кинга Идем в IT: пошаговый план для смены профессии

Практические улучшения

Пробелы: ваш инструмент для коррекции

Чтобы избавиться от лишних символов после завершения индикатора, можно вывести строку с пробелами и символом новой строки '\n'.

Java
Скопировать код
System.out.print("\r" + new String(new char[width]).replace('\0', ' ') + "\n");

Этот подход гарантирует чистоту вывода в терминале.

StringBuilder: Инструмент для ускорения работы

StringBuilder существенно увеличивает скорость при частых операциях с строками по сравнению с обычными методами. Примените StringBuilder для создания полосы прогресса.

Java
Скопировать код
StringBuilder barBuilder = new StringBuilder(width);
for (int i = 0; i < progress; i++) {
    barBuilder.append(icon);
}
for (int i = progress; i < width; i++) {
    barBuilder.append(' ');
}
System.out.printf(format, (done * 100) / total, barBuilder.toString(), '|');

Корректное прерывание

Индикатор должен правильно обрабатывать прерывание длительных операций.

Java
Скопировать код
try {
    for (int i = 0; i <= total; i++) {
        if (Thread.interrupted()) {
            // Очищаем вывод перед завершением, если поток прерван
            break;
        }
        updateProgressBar(i, total);
        Thread.sleep(100); 
    }
} catch (InterruptedException ex) {
    Thread.currentThread().interrupt(); 
    System.out.println("Прервано пользователем! Процесс остановлен.");
}

Уделите внимание выбору шрифта

Для сохранения визуальной целостности индикатора рекомендуется использование моноширинных шрифтов, таких как Menlo, Fira Mono, Source Code Pro или SF Mono.

Расширение возможностей использования

Библиотека "Я"

Для готовых решений рассмотрите использование библиотеки ProgressBar, представленной на GitHub. Она предлагает настраиваемые ASCII-индикаторы, совместимые со шрифтами Consolas и Andale Mono.

Отображение обновлений в режиме реального времени

Обновления в режиме реального времени значительно улучшают взаимодействие пользователя с программой, если процесс динамично изменяется, и его выполнение может наблюдаться.

Визуализация

Выход в консоли можно представить в виде железнодорожных путей, а индикатор прогресса – как движущийся по ним поезд. 🚂

Markdown
Скопировать код
// Старт
[------------------------] 🚂💨 Попробуй со мной догнать! (0%)

// Середина пути
[=========---------------] 🚂💨 Ускоряемся! (50%)

// Финишная прямая
[========================] 🚂💨 Прибыли к финишу, дамы и господа! (100%)

Обновление перемещает "поезд" по "рельсам" в нужное положение.

Java
Скопировать код
System.out.print("\r" + progressBar); // Поезд всегда точно в срок!

Это предоставляет представление об уровне прогресса и скорости работы программы.

Полезные материалы

  1. Прогресс в консольных приложениях на Java – Stack Overflow — источник информации о индикаторах выполнения в консольных приложениях Java.
  2. GitHub – ctongfei/progressbar: Консольный индикатор выполнения для Java / JVM — готовый к применению индикатор выполнения для Java.
  3. GitHub – jline/jline3: JLine – это Java-библиотека для управления консольным вводом — библиотека для работы с консольным вводом и индикаторами выполнения.
  4. Примеры использования org.apache.commons.cli в Java — использование Apache Commons CLI для работы с аргументами командной строки.
  5. Понимание механизма прерывания потоков в Java — гид по работе с прерываниями потоков в Java, полезно при создании системы отслеживания прогресса.
Свежие материалы