When/why to call System.out.flush() in Java
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.
why we use system.out.flush()?
When you write data out to a stream, some amount of buffering will occur, and you never know for sure exactly when the last of the data will actually be sent. You might perform many
operations on a stream before closing it, and invoking the flush() method guarantees that the last of the data you thought you had already written actually gets out to the file.
Extract from Sun Certified Programmer for Java 6 Exam by Sierra & Bates.
In your example, it doesn't change anything because System.out
performs auto-flushing meaning that everytime a byte in written in the buffer, it is automatically flushed.
What is the purpose of flush() in Java streams?
From the docs of the flush
method:
Flushes the output stream and forces any buffered output bytes to be written out. The general contract of flush is that calling it is an indication that, if any bytes previously written have been buffered by the implementation of the output stream, such bytes should immediately be written to their intended destination.
The buffering is mainly done to improve the I/O performance. More on this can be read from this article: Tuning Java I/O Performance.
Why does System.out.print cause autoflush?
Shouldn't that happen only for println?
The Javadoc doesn't say when it won't be flushed. And it says it will be flushed on a println()
or a newline.
Java: How to configure System.out to have autoflush enabled?
Wrap it in another stream:
PrintStream newOut = new PrintStream(System.out, true);
// And then set it to out (Credit to David Zimmerman in the comments)
System.setOut(newOut);
Related Topics
Custom JSON Deserialization with Jackson
Intellij Fat One Jar Artifact Does Not Generate a Working Output
Is It Possible/How to Embed and Access HTML Files in a Jar
Android - How to Take Screenshot Programmatically
Android: Dex Cannot Parse Version 52 Byte Code
How to Use Interceptor to Add Headers in Retrofit 2.0
Creating Hashmap from a JSON String
Android Classnotfoundexception
Is There an Easier Way to Parse Xml in Java
Is There Any Library or Algorithm for Persian (Shamsi or Jalali) Calendar in Android
Java.Sql.Sqlexception: Column Count Doesn't Match Value Count at Row 1
Map.Clear() VS New Map:Which One Will Be Better
Is Custom Enum Serializable Too
How to Catch a Firebase Auth Specific Exceptions
Android: Textview Automatically Truncate and Replace Last 3 Char of String
Classnotfoundexception: Didn't Find Class "Com.Google.Android.Gms.Ads.Adview"