Maison > Java > javaDidacticiel > Pourquoi « System.out.println » et « System.err.println » produisent-ils parfois une sortie dans le désordre en Java ?

Pourquoi « System.out.println » et « System.err.println » produisent-ils parfois une sortie dans le désordre en Java ?

Patricia Arquette
Libérer: 2025-01-01 02:03:10
original
812 Les gens l'ont consulté

Why Does `System.out.println` and `System.err.println` Sometimes Produce Out-of-Order Output in Java?

Sortie dans le désordre de System.out.println et System.err.println

En Java, System.out.println () écrit dans le flux de sortie standard, tandis que System.err.println() écrit dans le flux d'erreurs standard. En règle générale, ces flux sont imprimés successivement sur la console. Cependant, dans certaines circonstances, ce comportement peut ne pas être cohérent.

Considérez l'extrait de code suivant :

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        System.out.println("out");
        System.err.println("err");
    }
}
Copier après la connexion

Lorsque vous exécutez ce programme, il produit le résultat suivant :

out
out
out
out
out
err
err
err
err
err
Copier après la connexion

Au lieu d'alterner entre « out » et « err », la sortie affiche tous les messages « out » suivis de tous les messages « err ». Cet écart s'explique par la nature différente des flux de sortie standard et des flux d'erreurs.

Les flux de sortie en Java sont mis en cache, ce qui signifie que les données ne sont pas immédiatement écrites sur la console. Au lieu de cela, il est stocké dans un tampon interne et vidé périodiquement. Le processus de vidage est déclenché par divers critères, tels qu'une certaine période d'inactivité ou l'atteinte d'une taille spécifique par le tampon.

Dans le cas de l'extrait de code ci-dessus, la sortie standard et les flux d'erreurs écrivent dans leurs fichiers respectifs. tampons. Étant donné que les écritures ne sont pas synchronisées, il est possible que le tampon du flux d'erreurs se remplisse en premier et soit vidé, même si certains messages « out » restent encore dans le tampon du flux de sortie. Cela entraîne la sortie dans le désordre observée.

Pour résoudre ce problème, vous pouvez vous assurer que les deux flux de sortie sont vidés après chaque écriture. Le code suivant inclut des appels à System.out.flush() et System.err.flush() dans la boucle :

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        System.out.println("out");
        System.out.flush();
        System.err.println("err");
        System.err.flush();
    }
}
Copier après la connexion

Avec cette modification, la sortie sera imprimée dans l'ordre alterné attendu :

out
err
out
err
out
err
out
err
out
err
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal