System.setOut 恢复

本文探讨了在Java中如何恢复被修改的System.out。通过预先声明引用的方式,可以在使用完毕后将其恢复到原始状态。此外,还提到了PrintStream在指向文件时需要注意文件是否存在等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该方法修改了out指向的PrintStream,那怎么恢复回去呢?

刚开始想使用clone()方法,不过System.out没有那个方法,然后上网找了下发现可以事先声明一个引用,这就引起另外一个问题,out会被回收吗?什么时候回收……待看了thingking injava再想。

 

我想,修改了setOut,在用完了之后应该改回来吧。

 

另外,PrintStream并不能过滤所有的Exception,至少如果让他指向一个文件,还是要判断文件是否存在的。

### Java 中 `System.out` 的使用方法 #### 基本输出功能 在 Java 编程语言中,`System.out.print()` 和 `System.out.println()` 是用于向标准输出(通常是控制台)发送数据的两种常用方式。前者不会自动换行而后者会在每次调用后添加新行字符,因此连续两次调用 `System.out.println("a")` 将导致如下显示效果: ``` a a ``` [^1] 对于更复杂的字符串格式化需求,还可以利用转义序列来调整输出布局。例如 `\t` 表示水平制表符、`\r` 返回行首位置而不移动到下一行、`\n` 则是换行操作;另外也支持十六进制编码表示特殊字符如 `\xHH` 形式。 ```java // 输出带制表位的内容 System.out.print("First\tSecond"); // 结合多种转义字符 System.out.println("\nThird line.\rOverwritten part."); ``` #### 获取并重定向输出流 为了捕获由 `System.out` 发送的信息而不是直接展示给用户查看,在某些场景下可能希望将其转向其他目的地比如文件或者内存缓冲区。下面的例子展示了如何通过创建自定义的 `PrintStream` 对象并与之关联一个字节数组输出流 (`ByteArrayOutputStream`) 来达到这一目的。 ```java import java.io.ByteArrayOutputStream; import java.io.PrintStream; public class RedirectOutputExample { public static void main(String[] args) throws Exception { ByteArrayOutputStream baoStream = new ByteArrayOutputStream(); PrintStream cacheStream = new PrintStream(baoStream); // 保存原始的标准输出流以便后续恢复 PrintStream oldStream = System.out; try{ // 设置新的标准输出为目标缓存流 System.setOut(cacheStream); // 执行一些打印动作但此时并不会立即呈现于屏幕之上 System.out.println("Captured message."); // 提取已记录的数据作为字符串形式返回 String capturedText = baoStream.toString(); // 展现实际获得的结果 System.out.flush(); // 清空任何残留未处理的数据包 // 恢复原来的标准输出设置 System.setOut(oldStream); // 正常情况下这里应该看到之前被隐藏的消息内容 System.out.println(capturedText); } finally { // 确保即使发生异常也能恢复正常状态 System.setOut(oldStream); } } } ``` [^2] #### 减少冗余输入量的小技巧 考虑到频繁键入完整的 `System.out.println()` 可能带来不便之处,开发者可以通过导入特定类下的静态成员简化此过程。具体做法是在源码头部声明 `import static java.lang.System.*;` ,之后便可以直接运用简短的形式完成相同的操作——即只需写出 `out.println(...)` 即可达成目标。 ```java import static java.lang.System.*; class SimplifiedPrintingDemo { public static void main(String[] args){ out.println("A shorter way to print!"); } } ``` [^3] 值得注意的是,在正式的产品级应用程序里应当避免过度依赖此类便捷措施,因为这可能会降低代码清晰度并且不利于维护工作。相反建议采用专业的日志框架来进行消息跟踪与错误报告等活动。 #### 日志管理最佳实践 当涉及到大型项目的构建时,推荐使用专门的日志库代替简单的 `System.out.println()` 。诸如 Log4j 或 Slf4j 这样的工具提供了更为灵活丰富的配置选项以及更好的性能表现,有助于提高系统的稳定性和可靠性。此外,在准备部署至生产环境前务必仔细审查整个工程确保没有任何遗留下来的临时诊断语句混杂其中以免造成不必要的困扰。 [^4] #### 自定义终端样式 最后值得一提的功能是对命令行界面外观进行个性化定制的能力。借助 ANSI 转义码可以在大多数现代操作系统上改变文字的颜色和其他视觉属性。以下是几个常见色彩对应的模板实例: - **红色**: `\033[31m...text...\033[0m` - **绿色**: `\033[32m...text...\033[0m` - **黄色**: `\033[33m...text...\033[0m` - **蓝色**: `\033[34m...text...\033[0m` - **紫色**: `\033[35m...text...\033[0m` - **青色**: `\033[36m...text...\033[0m` - **白色**: `\033[37m...text...\033[0m` 请注意并非所有的平台都完全兼容这些特性,所以在跨平台应用中应谨慎考虑其适用范围。 ```java // 显示彩色提示信息 System.out.println("\u001B[31mError occurred!\u001B[0m"); ``` [^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值