Java Language Blocage ou redirection de la sortie / erreur standard


Exemple

Parfois, une bibliothèque tierce mal conçue écrit des diagnostics indésirables dans les flux System.out ou System.err . Les solutions recommandées seraient soit de trouver une meilleure bibliothèque, soit (dans le cas de l’Open Source) de résoudre le problème et de fournir un correctif aux développeurs.

Si les solutions ci-dessus ne sont pas réalisables, vous devriez alors envisager de rediriger les flux.

Redirection sur la ligne de commande

Sur un UNIX, Linux ou MacOSX peut être fait à partir du shell en utilisant > redirection. Par exemple:

$ java -jar app.jar arg1 arg2 > /dev/null 2>&1
$ java -jar app.jar arg1 arg2 > out.log 2> error.log

Le premier redirige la sortie standard et l'erreur standard vers "/ dev / null", ce qui rejette tout ce qui est écrit dans ces flux. La seconde redirige la sortie standard vers "out.log" et l'erreur standard vers "error.log".

(Pour plus d'informations sur la redirection, reportez-vous à la documentation du shell de commandes que vous utilisez. Des conseils similaires s'appliquent à Windows.)

Vous pouvez également implémenter la redirection dans un script d'encapsuleur ou un fichier de commandes qui lance l'application Java.

Redirection dans une application Java

Il est également possible de rediriger les flux dans une application Java en utilisant System.setOut() et System.setErr() . Par exemple, l'extrait de code suivant redirige la sortie standard et l'erreur standard vers 2 fichiers journaux:

System.setOut(new PrintStream(new FileOutputStream(new File("out.log"))));
System.setErr(new PrintStream(new FileOutputStream(new File("err.log"))));

Si vous voulez supprimer complètement la sortie, vous pouvez créer un flux de sortie qui "écrit" dans un descripteur de fichier non valide. C'est fonctionnellement équivalent à écrire dans "/ dev / null" sous UNIX.

System.setOut(new PrintStream(new FileOutputStream(new FileDescriptor())));
System.setErr(new PrintStream(new FileOutputStream(new FileDescriptor())));

Attention: soyez prudent avec setOut et setErr :

  1. La redirection affectera l'ensemble de la machine virtuelle Java.
  2. Ce faisant, vous supprimez la capacité de l'utilisateur à rediriger les flux à partir de la ligne de commande.