Java printf не печатает - PullRequest
       35

Java printf не печатает

5 голосов
/ 24 марта 2012

Я пытаюсь сделать индикатор прогресса кроссплатформенной консоли в Java.Поэтому я использую метод System.out.printf для распечатки процента:

System.out.printf("\t%2.2f%%\b\b\b\b\b\b", percentage);

и помещаю это в цикл for.Проблема, с которой я сталкиваюсь, заключается в том, что она ничего не печатает, пока не закончится весь цикл for.Это пример программы, показывающий проблему:

public class Test {

    public static void main(String[] args) {
        for(int i =0; i<5000; i++){
            System.out.printf("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f);
            System.out.flush();
        }
    }
}

Я думаю, что проблема как-то связана с оптимизацией компилятора, но я не уверен.Странно то, что System.out.println печатает, когда работает цикл for.

Редактировать: я забыл добавить это к проблеме.Но я уже пытался очистить буфер.Это не имеет значения.Добавление %n в конец моей строки printf работает, но начинается новая строка, мне действительно нужно повторно использовать текущую строку.

Все противоположные решения работают.Но они работают только в настоящих консолях.Не консоль netbeans или затмение.

Ответы [ 4 ]

5 голосов
/ 24 марта 2012

Это потому, что выходной поток буферизован. Если вы добавите «% n» в конце строки формата, вы также сгенерируете разрыв строки, и строка будет очищена (то есть напечатана). В качестве альтернативы вызовите System.out.flush(), чтобы вручную очистить выходной поток и принудительно распечатать содержимое буфера.

2 голосов
/ 24 марта 2012

И еще раз проблема с промывкой потока.Добавьте эту строку после того, как ваш printf:

System.out.flush();

System.out.println сбрасывает (очень похоже на C ++ << endl).Однако printf не сбрасывается и использует буфер.

1 голос
/ 24 марта 2012

Добавить вызов к flush():

    for(int i =0; i<5000; i++){
        System.out.printf("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f);
        System.out.flush();
    }

Без flush() выходные данные накапливаются в буфере, который очищается только время от времени (когда он заполнен или когда переводится новая строка)

Странно то, что System.out.println печатает, когда работает цикл for.

Причина в том, что поток является строковымбуферизация.Это означает, что каждая новая строка вызывает неявный сброс.Разница между вашим кодом и println() заключается в том, что последний печатает новую строку каждый раз, когда он вызывается.

0 голосов
/ 24 марта 2012

Попробуйте использовать Консоль вместо:

for(int i =0; i<5000; i++){
    System.console().format("\b\b\b\b\b\b%2.2f%%", ((float) i/5000f)*100f);
    System.console().flush();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...