Console.writer().println() is displaying "Enter 3 words" after console.readLine(). Can anyone explain why?
class Class3{
public static void main(String... args){
Console console = System.console();
if(console == null){
throw new RuntimeException("No console");
}else{
//System.out.println("Enter 3 words");
//console.format("Enter 3 words");
console.writer().println("Enter 3 words");
List<String> strings = new ArrayList<>();
for(int i=0;i<3;++i){
strings.add(console.readLine());
}
console.format("You entered %s, %s, %s",
strings.get(0),
strings.get(1),
strings.get(2)
);
console.writer().println();
}
}
}
Output: Output of the application
I tried using System.out.println() and console.format() and both print "Enter 3 words" before the application accepts 3 strings
A quick look at JDK24 source code shows Console as a sealed class with permits ProxyingConsole. The class ProxyingConsole declares writer() to use WrappingWriter extends PrintWriter which constructs super class PrintWriter which sets this.autoFlush = false
This means that when you use console.writer(), it should be followed by console.writer().flush() if you want to guarantee the output is shown when you want it to.
System.out.println() is defined with autoflush so any output is shown for each call.
Thanks for the useful comments. JDKs have different behaviours for autoFlush in Console writer. From some checks on OpenJDK in Windows 11:
| JDK | console.writer() autoFlush | System.out autoFlush |
|---|---|---|
| 14 17 18 19 20 | ✅ true | ✅ true |
| 21 22 23 24 25b18 | ❌ false | ✅ true |
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With