Манипулировать или редактировать System.out (java)

Возможно ли это сделать на Java, например, с помощью System.out.println(...), а затем как-то отредактировать написанный текст?

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

Таким образом, при запуске задачи в потоке System.out будет отображаться что-то подобное.

Doing x task ... 0%

Затем обновите %, отображаемый при достижении прогресса. Всякий раз, когда задача выполнена, измените ее на «Готово!» вместо того, чтобы показывать 100% или какой-то случайный процент.

Извините, если это плохой и трудный для понимания вопрос, я действительно понятия не имею, как его сформулировать, а английский не является моим родным языком. Не стесняйтесь редактировать вопрос, чтобы сделать его более понятным


person Nicolas Martel    schedule 29.12.2013    source источник
comment
Использовать \b?   -  person Ismail Badawi    schedule 29.12.2013


Ответы (2)


Не используйте println; вместо этого используйте print и добавьте \r в конце строки. Например,

System.out.print("Doing x task... " + percentDone + "%\r");
System.out.flush();

Символ \r (возврат каретки) возвращает "точку вставки" обратно в начало текущей строки без перехода к следующей. Когда вы печатаете текст после этого, он перезапишет существующую строку.

При использовании print становится необходимым flush выходной поток вручную. В противном случае вы не получите никакого вывода, пока внутренний буфер не будет заполнен.

Обратите внимание, что этот трюк не работает в выводе консоли Eclipse, NetBeans и большинства других IDE, поскольку они не интерпретируют специальные управляющие символы, такие как \r или \b. Вы должны использовать его из командной строки.

person Marko Topolnik    schedule 29.12.2013
comment
Большой! Мне всегда было интересно, как они делают этот процент. Кроме того, он работает в консоли IntelliJ IDEA;) - person Mohammad Banisaeid; 29.12.2013
comment
Приятно осознавать, что IntelliJ всегда на шаг впереди... - person Marko Topolnik; 29.12.2013
comment
Вау, я думал, что \r — это чисто историческая реликвия, единственная цель которой — предшествовать \n. Я ошибался. - person Siyuan Ren; 29.12.2013

Если вы хотите перезаписать уже написанный текст, вы можете использовать управляющие символы, такие как \b или \r, или движения курсора. Проблема в том, что разные консоли, такие как IDE, ведут себя по-разному, поэтому стандартного способа сделать это нет.


Если вы хотите редактировать вывод по мере его выхода...

Вы можете сделать это, написав свой собственный PrintStream и используя

System.setOut(myPrintStream);

Однако было бы проще отредактировать исходный код, даже если вам придется сначала его декомпилировать.

person Peter Lawrey    schedule 29.12.2013