Я делаю программу командной строки Java.

Как я могу изменить содержимое уже отображаемой строки?

Так, например, я мог бы отобразить:

Статус: 0%
Статус: 2%
...
Статус: 50%

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

Я видел, как некоторые консольные программы делали это раньше, так как я могу сделать это в java?

4
Isharyan 24 Авг 2009 в 18:28

2 ответа

Лучший ответ

В большинстве случаев вы можете выводить возврат каретки (\r), а не новую строку (\n). Это зависит от поддерживающего его терминала, что в большинстве случаев так и есть. \r перемещает курсор обратно в начало строки.

РЕДАКТИРОВАТЬ: Очевидно, при этом используйте System.out.print, а не System.out.println (или просто используйте простую, а не ln форму метода вывода, который вы используете) - поскольку Суффикс ln означает, что после вашего текста автоматически ставится новая строка.

Примере:

for (n = 10000; n < 10010; ++n) {
    System.out.print(String.valueOf(n) + "\r");
}
System.out.println("Done");

Когда это закончится, вы, вероятно, увидите это на экране консоли:

Done0

... поскольку «Готово» короче, чем самая длинная предыдущая выводимая вами информация, и поэтому не полностью перезаписывает его (отсюда 0 в конце, оставшийся от «10010»). Итак, урок таков: отслеживайте самое длинное, что вы пишете, и перезаписывайте его пробелами.

3
T.J. Crowder 24 Авг 2009 в 18:44
Не добавит ли это результат к ранее выведенному «print»?
 – 
Isharyan
24 Авг 2009 в 18:33
В известном мне коде используется \b для «удаления» заменяемых битов вместо замены всей строки на \r.
 – 
Chris Jester-Young
24 Авг 2009 в 18:38
@Isharyan: \r помещает курсор в начало строки ("для большинства терминалов"), поэтому все, что вы добавляете после него, будет отображаться в начале строки.
 – 
Chris Jester-Young
24 Авг 2009 в 18:39
@lsharyan: Извини, я должен был сказать то, что сказал Крис в ответе. Я его отредактирую.
 – 
T.J. Crowder
24 Авг 2009 в 18:41
Jester-Young: если в следующей появившейся строке физически меньше пробелов, чем в предыдущей, как мне убедиться, что у меня нет висящих остатков последней строки? Добавить кучу пробелов или?
 – 
Isharyan
24 Авг 2009 в 18:41

Взгляните на этот пример < / сильный>.

Рабочий код:

public class progress {
    public static void main(String[] args) throws InterruptedException {    
        for (int i = 0; i <= 100; i++) {
            Thread.sleep(30);
            System.out.print("\rSTATUS: "+i+" % " );
        }   
    }
}

Совет: для получения дополнительных сведений о Google - индикатор выполнения консоли Java

2
Pratik Deoghare 24 Авг 2009 в 18:50
Я бы добавил, что JLine очень хорошо работает для такого рода вещей
 – 
Brian Agnew
24 Авг 2009 в 18:39