Как я могу напечатать в той же строке?
Я хочу напечатать индикатор выполнения следующим образом:
[# ] 1%
[## ] 10%
[########## ] 50%
но все они должны быть напечатаны в той же строке в терминале вместо нового.
Я имею в виду, что каждая новая строка должна заменить предыдущую, речь идет не об использовании print()
вместо println()
.
как я могу сделать это на Java?
5 ответов:
отформатируйте строку следующим образом:
[# ] 1%\r
Примечание
\r
символ. Это так называемый возврат каретки это переместит курсор обратно в начало строки.наконец, убедитесь, что вы используете
System.out.print()
, а не
System.out.println()
в Linux существуют различные escape-последовательности для терминала управления. Например, существует специальная escape-последовательность для стирания всей строки:
[2K
и для перемещения курсора на предыдущую строку:[1A
. Поэтому все, что вам нужно, это печатать это каждый раз, когда вам нужно обновить строку. Вот код, который выводитLine 1 (second variant)
:System.out.println("Line 1 (first variant)"); System.out.print("[1A[2K"); System.out.println("Line 1 (second variant)");
есть коды для навигации курсора, очистки экрана и так далее.
Я думаю, что есть некоторые библиотеки, которые помогают с этим (
ncurses
?).
во-первых, я хотел бы извиниться за то, что поднял этот вопрос, но я чувствовал, что он может использовать другой ответ.
Дерек Шульц-это какая-то правильная. Символ '\b ' перемещает курсор печати на один символ назад, позволяя вам перезаписать символ, который был напечатан там (он не удаляет всю строку или даже символ, который был там, если вы не печатаете новую информацию сверху). Ниже приведен пример индикатора выполнения с использованием Java, хотя это не так следуйте вашему формату, он показывает, как решить основную проблему перезаписи символов (это было протестировано только в Ubuntu 12.04 с Java 7 Oracle на 32-разрядной машине, но она должна работать на всех системах Java):
public class BackSpaceCharacterTest { // the exception comes from the use of accessing the main thread public static void main(String[] args) throws InterruptedException { /* Notice the user of print as opposed to println: the '\b' char cannot go over the new line char. */ System.out.print("Start[ ]"); System.out.flush(); // the flush method prints it to the screen // 11 '\b' chars: 1 for the ']', the rest are for the spaces System.out.print("\b\b\b\b\b\b\b\b\b\b\b"); System.out.flush(); Thread.sleep(500); // just to make it easy to see the changes for(int i = 0; i < 10; i++) { System.out.print("."); //overwrites a space System.out.flush(); Thread.sleep(100); } System.out.print("] Done\n"); //overwrites the ']' + adds chars System.out.flush(); } }
вы можете распечатать символ обратного пространства '\b ' столько раз, сколько необходимо, чтобы удалить строку перед печатью обновленного индикатора выполнения.
package org.surthi.tutorial.concurrency; public class IncrementalPrintingSystem { public static void main(String...args) { new Thread(()-> { int i = 0; while(i++ < 100) { System.out.print("["); int j=0; while(j++<i){ System.out.print("#"); } while(j++<100){ System.out.print(" "); } System.out.print("] : "+ i+"%"); try { Thread.sleep(1000l); } catch (InterruptedException e) { e.printStackTrace(); } System.out.print("\r"); } }).start(); } }