“你好,阿米戈!今天,你将学习如何执行一项新任务:替换 System.out 对象。”
System.out 是 System 类中名为 out 的 static PrintStream 变量。此变量包含 final 修饰符,因此你可以直接为其赋予新值。但是,System 类包含一个可以执行此操作的特殊方法:setOut(PrintStream stream)。这就是我们将要使用的方法。
“真有趣。我们用什么替换它?”
“我们需要一些可以收集输出数据的对象。ByteArrayOutputStream 最适合此项工作。这是一个特殊的类,它是一个动态(可调整大小的)数组,并实现 OutputStream 接口。”
“数组和 OutputStream 之间的适配器?”
“差不多。代码看起来如下所示。”
代码
public static void main(String[] args) throws Exception
{
//在一个特殊变量中保存当前的 PrintStream
PrintStream consoleStream = System.out;
//创建动态数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//创建 PrintStream 类的适配器
PrintStream stream = new PrintStream(outputStream);
//将其设置为当前的 System.out
System.setOut(stream);
//调用一个对我们的更改一无所知的函数
printSomething();
//将写入 ByteArray 的数据转换为字符串
String result = outputStream.toString();
//将一切恢复原样
System.setOut(consoleStream);
}
public static void printSomething()
{
System.out.println("嗨");
System.out.println("我叫阿米戈");
System.out.println("再见!");
}
“我们将如何处理此行?”
“嗯,怎么处理都行。例如,可以将其反转。则代码如下所示:”
代码
public static void main(String[] args) throws Exception
{
//在一个特殊变量中保存当前的 PrintStream
PrintStream consoleStream = System.out;
//创建动态数组
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//创建 PrintStream 类的适配器
PrintStream stream = new PrintStream(outputStream);
//将其设置为当前的 System.out
System.setOut(stream);
//调用一个对我们的更改一无所知的函数
printSomething();
//将写入 ByteArray 的数据转换为字符串
String result = outputStream.toString();
//将一切恢复原样
System.setOut(consoleStream);
//反转字符串
StringBuilder stringBuilder = new StringBuilder(result);
stringBuilder.reverse();
String reverseString = stringBuilder.toString();
//将其输出到控制台
System.out.println(reverseString);
}
public static void printSomething()
{
System.out.println("嗨");
System.out.println("我叫阿米戈");
System.out.println("再见!");
}
“太有趣了!现在,我开始对这些小型类提供的强大功能有所了解了。”
“比拉博,谢谢你给我上了有趣的一课。”
GO TO FULL VERSION