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

Гонка между System.out и System.err в java

Пожалуйста, рассмотрите этот код Java:

public class CMain {
    public static void main(String[] args){

        for (int i = 0; i < 10; i++) {
            System.out.println("A");
            System.err.println("B");
        }

    }
}

Быстрый взгляд на код, некоторые из нас могут подумать, что вывод должен быть печатью As и Bs альтернативно. Однако это не так! Это случайный вид из 10 символов и 10 B. Что-то вроде этого:

enter image description here

Почему? и каково решение для него, чтобы альтернативы As и Bs отображались альтернативно (A B A B A B...) Прежде чем задать этот вопрос, я проверил несколько других подобных вопросов для решения и не работал для моего дела! Я привел некоторых из них здесь:

4b9b3361

Ответ 1

Why does this happen?

Это связано с тем, что out и err - это два разных потока вывода. Однако, оба они печатают на консоли. Поэтому вы не видите их как разные потоки. Более того, когда вы выполняете out.println(), не гарантируется, что вы увидите вывод на консоли, как только оператор будет выполнен. Вместо этого строки обычно (в зависимости от системы) хранятся в выходном буфере (если хотите), который затем обрабатывается системой для вывода вывода из буфера на экран.

Solution :(

Хотя, поскольку Eng.Fouad указал, что вы можете использовать setOut(System.err) или setErr(System.out), чтобы упорядочить их, я бы все же не предлагал это делать, когда вы на самом деле помещаете это в приложение (используйте его только для целей отладки).

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

Ответ 2

Они разные OutputStream s. Если вам действительно нужно гарантировать порядок их печати, используйте:

System.setErr(System.out);

или

System.setOut(System.err);

Ответ 3

Так как есть два отдельных потока, вы можете дать выходной.