Индикатор выполнения командной строки в Java

У меня есть программа Java, работающая в режиме командной строки. Я хотел бы отобразить индикатор выполнения, показывая процент выполненной работы. Такой же индикатор прогресса, который вы увидите, используя wget под unix. Это возможно?

Раньше я это делал. Это не столько о Java, сколько о том, какие персонажи отправлять на консоль.

Ключ – это разница между \n и \r . \n переходит в начало новой строки. Но \r – только возврат каретки – он возвращается к началу той же строки.

Так что вам нужно распечатать индикатор выполнения, например, путем печати строки

 "|======== |\r" 

На следующем тике индикатора выполнения перепишите одну строку с более длинной полосой. (потому что мы используем \ r, мы остаемся в одной строке) Например:

 "|========= |\r" 

То, что вы должны помнить, когда это делается, если вы тогда просто распечатываете

 "done!\n" 

У вас все еще может быть мусор из полосы выполнения на линии. Поэтому после того, как вы закончите работу с индикатором выполнения, обязательно напечатайте достаточно пробелов, чтобы удалить его из строки. Такие как:

 "done |\n" 

Надеюсь, это поможет.

Я нашел, что следующий код работает правильно. Он записывает байты в выходной буфер. Возможно, методы, использующие System.out.println() такой как метод System.out.println() заменяют вхождения \r на \n чтобы соответствовать завершению собственной строки цели (если она не настроена должным образом).

 public class Main{ public static void main(String[] arg) throws Exception { String anim= "|/-\\"; for (int x =0 ; x < 100 ; x++) { String data = "\r" + anim.charAt(x % anim.length()) + " " + x; System.out.write(data.getBytes()); Thread.sleep(100); } } } 

Существует https://github.com/ctongfei/progressbar , лицензия: MIT

Простой индикатор готовности консоли. Запись строки выполнения теперь выполняется в другом streamе.

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

Для шрифтов Consolas или Andale Mono используйте ProgressBarStyle.ASCII (см. Ниже), потому что глифы для рисования не правильно выровнены в этих шрифтах.

Maven:

  me.tongfei progressbar 0.5.5  

Применение:

 ProgressBar pb = new ProgressBar("Test", 100); // name, initial max // Use ProgressBar("Test", 100, ProgressBarStyle.ASCII) if you want ASCII output style pb.start(); // the progress bar starts timing // Or you could combine these two lines like this: // ProgressBar pb = new ProgressBar("Test", 100).start(); some loop { ... pb.step(); // step by 1 pb.stepBy(n); // step by n ... pb.stepTo(n); // step directly to n ... pb.maxHint(n); // reset the max of this progress bar as n. This may be useful when the program // gets new information about the current progress. // Can set n to be less than zero: this means that this progress bar would become // indefinite: the max would be unknown. ... pb.setExtraMessage("Reading..."); // Set extra message to display at the end of the bar } pb.stop() // stops the progress bar 

C # Пример, но я предполагаю, что это одинаково для System.out.print в Java. Не стесняйтесь исправить меня, если я ошибаюсь.

В принципе, вы хотите записать escape-символ \r в начало вашего сообщения, что приведет к тому, что курсор вернется к началу строки (Line Feed), не перейдя к следующей строке.

  static string DisplayBar(int i) { StringBuilder sb = new StringBuilder(); int x = i / 2; sb.Append("|"); for (int k = 0; k < 50; k++) sb.AppendFormat("{0}", ((x <= k) ? " " : "=")); sb.Append("|"); return sb.ToString(); } static void Main(string[] args) { for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(200); Console.Write("\r{0} {1}% Done", DisplayBar(i), i); } Console.ReadLine(); } 

Ниже приведена модифицированная версия:

 private static boolean loading = true; private static synchronized void loading(String msg) throws IOException, InterruptedException { System.out.println(msg); Thread th = new Thread() { @Override public void run() { try { System.out.write("\r|".getBytes()); while(loading) { System.out.write("-".getBytes()); Thread.sleep(500); } System.out.write("| Done \r\n".getBytes()); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }; th.start(); } 

… и в основном:

 loading("Calculating ..."); 

Я проверил процентный прогресс, чтобы проверить оставшийся файл загрузки.

Я периодически вызываю метод в загрузке файла, чтобы проверить общий размер файла, а оставшийся и присутствующий в % .

Его можно использовать и для других задач.

Пример тестирования и вывода

 progressPercentage(0, 1000); [----------] 0% progressPercentage(10, 100); [*---------] 10% progressPercentage(500000, 1000000); [*****-----] 50% progressPercentage(90, 100); [*********-] 90% progressPercentage(1000, 1000); [**********] 100% 

Тест с циклом for

 for (int i = 0; i <= 200; i = i + 20) { progressPercentage(i, 200); try { Thread.sleep(500); } catch (Exception e) { } } 

Метод может быть легко изменен:

 public static void progressPercentage(int remain, int total) { if (remain > total) { throw new IllegalArgumentException(); } int maxBareSize = 10; // 10unit for 100% int remainProcent = ((100 * remain) / total) / maxBareSize; char defaultChar = '-'; String icon = "*"; String bare = new String(new char[maxBareSize]).replace('\0', defaultChar) + "]"; StringBuilder bareDone = new StringBuilder(); bareDone.append("["); for (int i = 0; i < remainProcent; i++) { bareDone.append(icon); } String bareRemain = bare.substring(remainProcent, bare.length()); System.out.print("\r" + bareDone + bareRemain + " " + remainProcent * 10 + "%"); if (remain == total) { System.out.print("\n"); } } 

Это было бы возможно с помощью библиотеки Java Curses. Это то, что я нашел. Я не использовал его сам, и я не знаю, является ли это кросс-платформенным.

Я использую «прыгающий» индикатор выполнения, когда мне нужно отложить инструмент, чтобы предотвратить состояние гонки.

 private void delay(long milliseconds) { String bar = "[--------------------]"; String icon = "%"; long startTime = new Date().getTime(); boolean bouncePositive = true; int barPosition = 0; while((new Date().getTime() - startTime) < milliseconds) { if(barPosition < bar.length() && barPosition > 0) { String b1 = bar.substring(0, barPosition); String b2 = bar.substring(barPosition); System.out.print("\r Delaying: " + b1 + icon + b2); if(bouncePositive) barPosition++; else barPosition--; } if(barPosition == bar.length()) { barPosition--; bouncePositive = false; } if(barPosition == 0) { barPosition++; bouncePositive = true; } try { Thread.sleep(100); } catch (Exception e) {} } System.out.print("\n"); } 

Я недавно столкнулся с той же проблемой, вы можете проверить мой код: я установил его для одного # на 5%, который вы можете изменить позже.

 public static void main (String[] args) throws java.lang.Exception { int i = 0; while(i < 21) { System.out.print("["); for (int j=0;j 
 public static void main(String[] argv) throws Exception{ System.out.write("\r".getBytes()); int percentage =10; while(percentage <= 100) { String temp =generateStars(percentage); System.out.write(temp.getBytes()); System.out.print("\b\b\b"); percentage = percentage+10; Thread.sleep(500); } } public static String generateStars(int percentage) { int startsNum = percentage / 4; StringBuilder builder = new StringBuilder(); while(startsNum >= 0) { builder.append("*"); startsNum--; } builder.append(percentage+"%"); return builder.toString(); } в public static void main(String[] argv) throws Exception{ System.out.write("\r".getBytes()); int percentage =10; while(percentage <= 100) { String temp =generateStars(percentage); System.out.write(temp.getBytes()); System.out.print("\b\b\b"); percentage = percentage+10; Thread.sleep(500); } } public static String generateStars(int percentage) { int startsNum = percentage / 4; StringBuilder builder = new StringBuilder(); while(startsNum >= 0) { builder.append("*"); startsNum--; } builder.append(percentage+"%"); return builder.toString(); } 
 public class ProgressBar { private int max; public ProgressBar(int max0) { max = max0; update(0); } public void update(int perc) { String toPrint = "|"; for(int i = 0; i < max; i++) { if(i <= (perc + 1)) toPrint += "="; else toPrint += " "; } if(perc >= max) Console.print("\r"); else Console.print(toPrint + "|\r"); } } 
  • Сравнение строк, нечувствительных к регистру, в C ++
  • Подобный строковый алгоритм
  • Сравнение строк и преобразование строк в Java
  • Где живут строковые литералы Java и .NET?
  • Как преобразовать целое число цвета в шестнадцатеричную строку в Android?
  • Как конкатенировать строки с заполнением в sqlite
  • Как разбить строку на 2 строки в C
  • Чтение файла по строке в C #
  • Regex.IsMatch vs string.Contains
  • Разделение строки на куски определенного размера
  • Почему преобразование из строковой константы в 'char *' допустимо в C, но недействительно в C ++
  • Давайте будем гением компьютера.