Реализация progress bar в командной строке на Java
Быстрый ответ
Способ быстрого создания индикатора выполнения – применить метод updateProgressBar()
. Этот метод позволяет отобразить динамический индикатор, который демонстрирует прогресс выполнения задач. Результат представлен с высокой степенью точности с помощью String.format
, что обеспечивает ясную визуальную обратную связь пользователю.
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
: Необходимо заменить кодом выполнения задачи.
Практические улучшения
Пробелы: ваш инструмент для коррекции
Чтобы избавиться от лишних символов после завершения индикатора, можно вывести строку с пробелами и символом новой строки '\n'.
System.out.print("\r" + new String(new char[width]).replace('\0', ' ') + "\n");
Этот подход гарантирует чистоту вывода в терминале.
StringBuilder: Инструмент для ускорения работы
StringBuilder
существенно увеличивает скорость при частых операциях с строками по сравнению с обычными методами. Примените StringBuilder
для создания полосы прогресса.
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(), '|');
Корректное прерывание
Индикатор должен правильно обрабатывать прерывание длительных операций.
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
.
Отображение обновлений в режиме реального времени
Обновления в режиме реального времени значительно улучшают взаимодействие пользователя с программой, если процесс динамично изменяется, и его выполнение может наблюдаться.
Визуализация
Выход в консоли можно представить в виде железнодорожных путей, а индикатор прогресса – как движущийся по ним поезд. 🚂
// Старт
[------------------------] 🚂💨 Попробуй со мной догнать! (0%)
// Середина пути
[=========---------------] 🚂💨 Ускоряемся! (50%)
// Финишная прямая
[========================] 🚂💨 Прибыли к финишу, дамы и господа! (100%)
Обновление перемещает "поезд" по "рельсам" в нужное положение.
System.out.print("\r" + progressBar); // Поезд всегда точно в срок!
Это предоставляет представление об уровне прогресса и скорости работы программы.
Полезные материалы
- Прогресс в консольных приложениях на Java – Stack Overflow — источник информации о индикаторах выполнения в консольных приложениях Java.
- GitHub – ctongfei/progressbar: Консольный индикатор выполнения для Java / JVM — готовый к применению индикатор выполнения для Java.
- GitHub – jline/jline3: JLine – это Java-библиотека для управления консольным вводом — библиотека для работы с консольным вводом и индикаторами выполнения.
- Примеры использования org.apache.commons.cli в Java — использование Apache Commons CLI для работы с аргументами командной строки.
- Понимание механизма прерывания потоков в Java — гид по работе с прерываниями потоков в Java, полезно при создании системы отслеживания прогресса.