53 votes

Quand/pourquoi appeler System.out.flush() en Java

Pourquoi certains flux doivent-ils être vidés ( FileOutputStream et les flux provenant de Sockets) alors que le flux de sortie standard ne le fait pas ?

Chaque fois que quelqu'un utilise le System.out PrintStream que ce soit en appelant println() ou write() ils ne vident jamais le flux. Cependant, d'autres programmeurs ont l'habitude d'appeler flush() a PrintStream / PrintWriter avec d'autres flux.

J'ai récemment posé cette question à plusieurs programmeurs et certains d'entre eux pensent qu'il existe un traitement de fond en Java qui permet de vider automatiquement la mémoire de l'ordinateur. System.out mais je ne trouve aucune documentation à ce sujet.

Quelque chose comme ça me fait me demander si le simple fait d'appeler System.out.println() est indépendant de la plateforme car certains systèmes peuvent nécessiter que vous vidiez le flux.

52voto

Mike Samuel Points 54712

System.out s'articule autour d'un PrintStream qui par défaut se vide à chaque fois qu'une nouvelle ligne est écrite.

De la javadoc :

autoFlush - Un booléen ; si c'est vrai, le tampon de sortie sera vidé à chaque fois qu'un tableau d'octets est écrit, l'un des éléments suivants étant utilisé println est invoquée, ou un caractère de nouvelle ligne ou un octet ( '\n' ) s'écrit

Ainsi, le println le cas que vous mentionnez est explicitement traité, et la write avec un byte[] est également garanti car il tombe dans la catégorie "chaque fois qu'un tableau d'octets est écrit".

Si vous remplacez System.out en utilisant System.setOut et que vous n'utilisez pas un flux autofluidant, vous devrez alors le purger comme n'importe quel autre flux.

Le code de la bibliothèque ne devrait probablement pas utiliser System.out directement, mais si c'est le cas, il faut faire attention à la chasse d'eau car un utilisateur de la bibliothèque pourrait remplacer System.out d'utiliser un jet sans rinçage.

Tout programme Java qui écrit une sortie binaire sur System.out doivent faire attention à flush avant exit car la sortie binaire n'inclut souvent pas de nouvelle ligne de fin.

6voto

David Z Points 49476

De la PrintStream documentation :

Facultativement, un PrintStream peuvent être créées de manière à se vider automatiquement ; cela signifie que la fonction flush est automatiquement invoquée après l'écriture d'un tableau d'octets, l'un des éléments de la méthode println est invoquée, ou un caractère de nouvelle ligne ou un octet ( '\n' ) est écrit.

Bien que cela ne soit pas mentionné explicitement dans la documentation, je crois savoir que System.out effectuera ce rinçage automatique.

4voto

Edwin Buck Points 33097

Lorsque vous ne pouvez pas attendre que l'élément s'affiche, videz le flux.

Lorsque la JVM s'arrête, le fait de ne pas vider le flux risque de perdre l'élément dans le tampon d'affichage, ce qui peut entraîner la perte définitive du message d'erreur qui vous explique pourquoi la JVM s'est arrêtée. Cela rend le débogage beaucoup plus difficile, car les gens ont alors tendance à dire "mais il n'est pas arrivé ici, car il aurait imprimé ceci".

2voto

Connor Doyle Points 929

System.out est par défaut en tampon de ligne. Donc si vous appelez println et non print il ne devrait pas y avoir de problème. Voir cet article pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X