为 System.out 编写我们自己的包装类

"你好,阿米戈!今天,你将学习如何执行一项新任务:替换 System.out 对象。"
System.outSystem 类中名为 out 的 static PrintStream 变量。此变量包含 final 修饰符,因此你可以直接为其赋予新值。但是,System 类包含一个可以执行此操作的特殊方法:setOut(PrintStream stream)。这就是我们将要使用的方法。

"真有趣。我们用什么替换它?"

"我们需要一些可以收集输出数据的对象。ByteArrayOutputStream 最适合此项工作。这是一个特殊的类,它是一个动态(可调整大小的)数组,并实现 OutputStream 接口。"

"数组和 OutputStream 之间的适配器?"

"差不多。代码看起来如下所示。"

代码

复制代码
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!");
}

"我们将如何处理此行?"

"嗯,怎么处理都行。例如,可以将其反转。则代码如下所示:"

代码

复制代码
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!");
}

"太有趣了!现在,我开始对这些小型类提供的强大功能有所了解了。"

"比拉博,谢谢你给我上了有趣的一课。"

相关推荐
平常心的技术小牛10 分钟前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆35 分钟前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
To_OC41 分钟前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
2601_963870201 小时前
【计算机毕业设计】基于Spring Boot的专科医院医疗管理系统
java·spring boot·课程设计
Bingo_BIG1 小时前
Java Spring 批量修改,实体、接口、方法的定义
java·spring
.道阻且长.2 小时前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
画中有画2 小时前
软件架构中质量属性(性能、安全、可扩展性)的权衡设计
java·运维·安全
Shaoxi Zhang2 小时前
JAVA学习笔记035——对象和JSON格式
java·笔记·学习
赵丙双2 小时前
CountDownLatch 源码分析
java·aqs·countdownlatch
余额瞒着我当琳2 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++