Quando / perché chiamare System.out.flush () in Java

Perché alcuni stream devono essere scaricati ( FileOutputStream e stream da Socket) mentre il stream di output standard non lo fa?

Ogni volta che qualcuno usa l’object System.out PrintStream , sia durante la chiamata a println() o write() , non scarica mai il stream. Tuttavia, altri programmatori chiamano normalmente flush() a PrintStream / PrintWriter con altri flussi.

Recentemente ho fatto questa domanda a diversi programmatori e alcuni credono che ci sia un po ‘di gestione in background in Java per il flush automatico del stream di System.out ma non riesco a trovare alcuna documentazione al riguardo.

Qualcosa del genere mi chiede se chiamare semplicemente System.out.println() sia indipendente dalla piattaforma poiché alcuni sistemi potrebbero aver bisogno di voi per svuotare il stream.

System.out si basa su un PrintStream che, per impostazione predefinita, svuota ogni volta che viene scritta una nuova riga.

Dalla javadoc :

autoFlush – A boolean; se true, il buffer di output verrà svuotato ogni volta che viene scritto un array di byte, viene invocato uno dei metodi println o viene scritto un carattere di nuova riga o un byte ( '\n' )

Quindi il caso println si menziona viene gestito in modo esplicito, e anche il caso di write con un byte[] viene svuotato perché cade sotto “ogni volta che viene scritto un array di byte”.

Se si sostituisce System.out utilizzando System.setOut e non si utilizza un stream di autoflushing, sarà necessario svuotarlo come qualsiasi altro stream.

Probabilmente il codice della libreria non dovrebbe usare direttamente System.out , ma se lo fa, allora dovrebbe fare attenzione a svuotare perché un utente della libreria potrebbe sovrascrivere System.out per utilizzare un stream non di flussaggio.

Qualsiasi programma Java che scrive output binario su System.out dovrebbe fare attenzione a flush prima exit perché l’output binario spesso non include una nuova riga finale.

Dalla documentazione di PrintStream :

Facoltativamente, è ansible PrintStream un PrintStream in modo da eseguire il flush automatico; questo significa che il metodo flush viene automaticamente richiamato dopo che una matrice di byte è stata scritta, uno dei metodi println è stato invocato o un carattere newline o byte ( '\n' ) è stato scritto.

Anche se non lo vedo menzionato esplicitamente nella documentazione, è a mia conoscenza che System.out eseguirà questo auto-flushing.

Quando non è ansible attendere la visualizzazione dell’elemento, svuotare lo stream.

Quando la JVM si interrompe, lo svuotamento del stream rischia di perdere l’elemento nel buffer di visualizzazione, il che potrebbe far sì che il messaggio di errore ragionevole indichi perché la JVM è andata persa per sempre. Ciò rende il debug molto più difficile, in quanto le persone tendono a dire “ma non è arrivato qui, perché lo avrebbe stampato”.

System.out è di default con buffer di riga. Quindi se stai chiamando println e non lo print non dovrebbe essere un problema. Vedi questo articolo per maggiori informazioni.