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
printlnmethods is invoked, or a newline character or byte (
'\n') is written
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.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
exit because binary output often does not include a trailing newline.