"Hej, Amigo! Idag ska du lära dig att göra något nytt: byt ut System.out-objektet."
System.out är en statisk PrintStream -variabel som kallas ut i klassen System . Denna variabel har den sista modifieraren, så du tilldelar den helt enkelt ett nytt värde. Systemklassen har dock en speciell metod för att göra detta: setOut(PrintStream stream) . Och det är vad vi kommer att använda.

"Intressant. Och vad ska vi ersätta det med?"

"Vi behöver något objekt som kan samla in utdata. ByteArrayOutputStream är bäst lämpad för det här jobbet. Det här är en specialklass som är en dynamisk (storleksändringsbar) array och implementerar OutputStream-gränssnittet."

"En adapter mellan en array och OutputStream?"

"Något sådant. Så här ser vår kod ut."

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

"Och vad ska vi göra med den här linjen?"

"Tja, vad vi vill. Till exempel skulle vi vända det. Då skulle koden se ut så här:"

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

"Vad intressant! Nu börjar jag förstå lite av de fantastiska möjligheter som dessa små klasser ger."
"Tack för den intressanta lektionen, Bilaabo."