"Здравей, Амиго! Днес ще научиш How да направиш нещо ново: да замениш обекта System.out."
System.out е статична променлива PrintStream , извикана в класа System . Тази променлива има крайния модификатор, така че просто й присвоявате нова стойност. Класът System обаче има специален метод за това: setOut(PrintStream stream) . И това ще използваме.

"Интересно. И с Howво ще го заменим?"

"Нуждаем се от няHowъв обект, който може да събира изходните данни. ByteArrayOutputStream е най-подходящ за тази задача. Това е специален клас, който е динамичен (с възможност за промяна на размера) масив и имплементира интерфейса OutputStream."

„Адаптер между масив и OutputStream?“

"Нещо подобно. Ето How изглежда нашият code."

Код
public static void main(String[] args) throws Exception
{
 //Save the current PrintStream in a special variable
 PrintStream consoleStream = System.out;

 //Create a dynamic array
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Create an adapter for the PrintStream class
 PrintStream stream = new PrintStream(outputStream);
 //Set it as the current System.out
 System.setOut(stream);

 //Call a function that knows nothing about our changes
 printSomething();

 //Convert the data written to our ByteArray into a string
 String result = outputStream.toString();

 //Put everything back to the way it was
 System.setOut(consoleStream);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("My name is Amigo");
 System.out.println("Bye-bye!");
}

— И Howво ще правим с тази линия?

„Е, Howвото искаме. Например, бихме го обърнали. Тогава codeът ще изглежда така:“

Код
public static void main(String[] args) throws Exception
{
 //Save the current PrintStream in a special variable
 PrintStream consoleStream = System.out;

 //Create a dynamic array
 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 //Create an adapter for the PrintStream class
 PrintStream stream = new PrintStream(outputStream);
 //Set it as the current System.out
 System.setOut(stream);

 //Call a function that knows nothing about our changes
 printSomething();

 //Convert the data written to our ByteArray into a string
 String result = outputStream.toString();

 //Put everything back to the way it was
 System.setOut(consoleStream);

 //Reverse the string
 StringBuilder stringBuilder = new StringBuilder(result);
 stringBuilder.reverse();
 String reverseString = stringBuilder.toString();

 //Output it to the console
 System.out.println(reverseString);
}

public static void printSomething()
{
 System.out.println("Hi");
 System.out.println("My name is Amigo");
 System.out.println("Bye-bye!");
}

„Колко интересно! Сега започвам да разбирам малко от страхотните възможности, които предоставят тези малки класове.“
— Благодаря ти за интересния урок, Билаабо.