Console.writer().println() está exibindo "Digite 3 palavras" após console.readLine(). Alguém pode explicar o porquê?
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();
}
}
}
Saída: Saída da aplicação
Tentei usar System.out.println() e console.format() e ambos imprimem "Digite 3 palavras" antes que o aplicativo aceite 3 strings
Uma rápida olhada no código-fonte do JDK24 mostra
Console
uma classe selada compermits ProxyingConsole
. A classeProxyingConsole
declarawriter()
usarWrappingWriter extends PrintWriter
quais construções superclassePrintWriter
que definethis.autoFlush = false
Isso significa que, ao usá-lo, você
console.writer()
deve seguir a instruçãoconsole.writer().flush()
if (se você quiser garantir que a saída seja exibida quando você quiser).System.out.println()
é definido com autoflush para que qualquer saída seja mostrada para cada chamada.EDITAR
Obrigado pelos comentários úteis. Os JDKs têm comportamentos diferentes para autoFlush no gravador de console. Algumas verificações no OpenJDK no Windows 11: