Сроки проблемы с 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) и внесет некоторое подобие порядка.