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
Patricia Arquetteoriginal
2025-01-01 02:03:10837parcourir

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");
    }
}

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

out
out
out
out
out
err
err
err
err
err

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();
    }
}

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

out
err
out
err
out
err
out
err
out
err

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!

Déclaration:
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