Сроки проблемы с PrintStreams

Я использую Eclipse IDE, и иногда, в зависимости от кода, вывод System.err печатается раньше, чем вывод System.out. Например:

    public static void main(String[] args) {    
        System.out.println("Regular text"); //1
        System.err.println("Error text"); //2           
    }

С этим кодом все в порядке. 2 выводится после 1. Однако добавление некоторых дополнительных предложений system.out меняет порядок в обратном порядке:

    public static void main(String[] args) {    
        System.out.println("Regular text"); //1
        System.err.println("Error text"); //2

        //Additional printing stuff
        for(String s = "a";s.length() < 200; s = s.concat("" + (char)(s.charAt(s.length()-1)+ 1))){
            System.out.println(s);
        }

    }

1 печатается после 2.

Как это возможно?

3 ответа

Решение

В некоторых операционных системах (в частности, *nix) стандартный поток вывода буферизуется, то есть все, что ему отправляют, может немного задержаться перед отправкой на терминал / экран. Однако стандартная ошибка часто не буферизируется или автоматически очищается после каждого вывода.

System.out а также System.err являются просто объектами Java для представления этих двух потоков и, следовательно, имеют тенденцию вести себя так же, как на платформе хоста. Но я не знаю ничего, что конкретно говорит, что они должны.

stderr а также stdout 2 разных потока, и, как правило, будут напечатаны при очистке. Я ожидаю, что произойдет некоторая буферизация, и это повлияет на промывку. Следовательно, количество данных в каждом потоке будет влиять на сброс и вывод.

Это отдельные потоки, каждый со своими буферами. Вы пишете в поток, который затем "копируется" или записывается на консоль.

Вы должны найти это призвание

System.out.flush()
System.err.flush()

сбросит потоки на фактическое устройство (консоль Eclipse) и внесет некоторое подобие порядка.

Другие вопросы по тегам