System.out
is based around a PrintStream
which by default flushes whenever a newline is written.
From the javadoc:
autoFlush – A boolean; if true, the output buffer will be flushed whenever a byte array is written, one of the
println
methods is invoked, or a newline character or byte ('\n'
) is written
So the println
case you mention is explicitly handled, and the write
case with a byte[]
is also guaranteed to flush because it falls under “whenever a byte array is written”.
If you replace System.out
using System.setOut
and don’t use an autoflushing stream, then you will have to flush it like any other stream.
Library code probably shouldn’t be using System.out
directly, but if it does, then it should be careful to flush because a library user might override System.out
to use a non flushing stream.
Any Java program that writes binary output to System.out
should be careful to flush
before exit
because binary output often does not include a trailing newline.