>Java >java지도 시간 >System.out.println() 및 System.err.println()이 예상한 순서대로 출력되지 않는 이유는 무엇입니까?

System.out.println() 및 System.err.println()이 예상한 순서대로 출력되지 않는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-15 07:25:11219검색

Why Doesn't System.out.println() and System.err.println() Output in the Expected Order?

System.out.println 및 System.err.println 출력의 예기치 않은 순서

System.out.println() 및 System.out.println() 및 System.err.println() 호출이 사용자가 만든 순서대로 콘솔에 인쇄되지 않는 것은 일반적인 현상입니다. issue.

Java에서 System.out과 System.err은 콘솔에 출력을 쓰는 데 사용되는 두 가지 다른 스트림입니다. System.out은 표준 출력에 사용되고 System.err은 오류 메시지에 사용됩니다. 기본적으로 이러한 스트림은 다르게 플러시됩니다.

System.out.println()을 호출하면 출력이 표준 출력 버퍼에 추가됩니다. 그러나 System.err.println()을 호출하면 출력이 표준 출력 버퍼와 오류 출력 버퍼 모두에 추가됩니다. 이는 System.err이 표준 출력이 리디렉션되는 경우에도 항상 표시되어야 하는 오류 메시지를 위한 것이기 때문입니다.

이러한 버퍼의 내용은 서로 다른 시간에 플러시됩니다. 표준 출력 버퍼는 줄 바꿈이 발생할 때마다 플러시되는 반면, 오류 출력 버퍼는 오류가 발생하거나 프로그램이 종료될 때 플러시됩니다.

결과적으로 System.out.println을 번갈아 호출하면 () 및 System.err.println()을 루프 내에서 실행하면 출력이 예상한 순서대로 표시되지 않습니다. 대신 모든 System.out.println() 호출이 함께 플러시되고 이어서 모든 System.err.println() 호출이 플러시됩니다.

해결책

이 문제를 해결하려면 System.out.println() 및 System.err.println()을 호출할 때마다 즉시 버퍼를 강제로 플러시할 수 있습니다. 이는 해당 스트림에서 플러시() 메소드를 사용하여 수행할 수 있습니다.

for (int i = 0; i < 5; i++) {
    System.out.println("out");
    System.out.flush(); // Flush the standard output buffer
    System.err.println("err");
    System.err.flush(); // Flush the error output buffer
}

flush() 호출을 추가하면 각 스트림의 출력이 즉시 콘솔로 전송되므로 올바른 순서로 나타납니다.

위 내용은 System.out.println() 및 System.err.println()이 예상한 순서대로 출력되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.