Подтвердить что ты не робот

Как я могу печатать на одной строке?

Я хочу напечатать индикатор выполнения следующим образом:

[#                    ] 1%
[##                   ] 10%
[##########           ] 50%

Но все они должны быть напечатаны в той же строке в терминале, а не в новой. Я имею в виду, что каждая новая строка должна заменить предыдущую, это не об использовании print() вместо println().

Как я могу сделать это на Java?

4b9b3361

Ответ 1

Отформатируйте строку так:

[#                    ] 1%\r

Обратите внимание на символ \r. Это так называемый возврат каретки, который вернет курсор к началу строки.

Наконец, убедитесь, что вы используете

System.out.print()

а не

System.out.println()

Ответ 2

В Linux существуют различные escape-последовательности для терминала управления. Например, существует специальная escape-последовательность для стирания всей строки: \33[2K и для перемещения курсора на предыдущую строку: \33[1A. Так что все, что вам нужно, это распечатать это каждый раз, когда вам нужно обновить строку. Вот код, который печатает Line 1 (second variant):

System.out.println("Line 1 (first variant)");
System.out.print("\33[1A\33[2K");
System.out.println("Line 1 (second variant)");

Существуют коды для навигации курсора, экрана очистки и т.д.

Я думаю, что есть некоторые библиотеки, которые помогают с ним (ncurses?).

Ответ 3

Во-первых, я хотел бы извиниться за то, что вернул этот вопрос, но я чувствовал, что он может использовать другой ответ.

Дерек Шульц выглядит правильно. Символ '\ b' перемещает курсор печати на один символ назад, позволяя вам перезаписать напечатанный там символ (он не удаляет всю строку или даже символ, который был там, если вы не печатаете новую информацию сверху). Ниже приведен пример индикатора выполнения с использованием Java, хотя он не соответствует вашему формату, он показывает, как решить основную проблему перезаписи символов (это было протестировано только в Ubuntu 12.04 с Oracle Java 7 на 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();
    }
}

Ответ 4

Вы можете напечатать символ обратного пробела '\ b' столько раз, сколько необходимо, чтобы удалить строку перед печатью обновленной строки выполнения.