« Bonjour, Amigo ! Aujourd'hui, tu vas apprendre comment faire quelque chose de nouveau : remplacer l'objet System.out. »
System.out - est une variable PrintStream statique appelée out dans la classe System. Cette variable a le modificateur final, tu lui affectes donc simplement une nouvelle valeur. Cependant, la classe System a une méthode spéciale pour cela : setOut(PrintStream stream). Et c'est ce que nous allons utiliser.

« Intéressant. Et par quoi ça va la remplacer ? »

« Nous avons besoin d'un objet qui peut recueillir les données de sortie. ByteArrayOutputStream est la classe la mieux adaptée à cette tâche. C'est une classe spéciale qui est un tableau dynamique (redimensionnable) et implémente l'interface OutputStream. »

« Un adaptateur entre un tableau et OutputStream ? »

« Quelque chose comme ça, oui. Voici à quoi notre code ressemble. »

Code
public static void main(String[] args) throws Exception
{
 //Enregistrer le PrintStream actuel dans une variable spéciale
 PrintStream consoleStream = System.out;

 //Créer un tableau dynamique
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Créer un adaptateur pour la classe PrintStream
 PrintStream stream = new PrintStream(outputStream);
 //Le définir comme le System.out actuel
 System.setOut(stream);

 //Appeler une fonction qui ne sait rien au sujet de nos modifications
 printSomething();

 //Convertir les données écrites dans notre ByteArray en chaîne
 String result = outputStream.toString();

 //Tout remettre à son état d'origine
 System.setOut(consoleStream);
}

public static void printSomething()
{
 System.out.println("Bonjour");
 System.out.println("Je m'appelle Amigo");
 System.out.println("Bye-bye !");
}

« Et qu'est-ce qu'on fait avec cette ligne ? »

« Eh bien, tout ce que nous voulons. Par exemple, on pourrait l'inverser. Dans ce cas le code ressemblerait à ceci : »

Code
public static void main(String[] args) throws Exception
{
 //Enregistrer le PrintStream actuel dans une variable spéciale
 PrintStream consoleStream = System.out;

 //Créer un tableau dynamique
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Créer un adaptateur pour la classe PrintStream
 PrintStream stream = new PrintStream(outputStream);
 //Le définir comme le System.out actuel
 System.setOut(stream);

 //Appeler une fonction qui ne sait rien au sujet de nos modifications
 printSomething();

 //Convertir les données écrites dans notre ByteArray en chaîne
 String result = outputStream.toString();

 //Tout remettre à son état d'origine
 System.setOut(consoleStream);

 //Inverser la chaîne
 StringBuilder stringBuilder = new StringBuilder(result);
 stringBuilder.reverse();
 String reverseString = stringBuilder.toString();

 //L'imprimer dans la console
 System.out.println(reverseString);
}

public static void printSomething()
{
 System.out.println("Bonjour");
 System.out.println("Je m'appelle Amigo");
 System.out.println("Bye-bye !");
}

« C'est super intéressant ! Maintenant, je commence à comprendre un peu les grandes possibilités que ces petites classes ouvrent. »
« Merci pour cette leçon intéressante, Bilaabo. »