Java中截获标准输出到GUI控件
以前在使用Java开发项目时,曾遇到这么一种情景:在一个Eclipse插件工程中,当插件运行后进行多线程仿真执行,这时需要捕获并输出Java的标准输出流和错误流。
View Code
View Code
1. 解决思路
Java中System类提供了可以重定向的方法setOut(PrintStream out)、setErr(PrintStream err)、setIn(InputStream in)。因此,使用setOut和setErr就够了,这二个方法都要传入一个PrintStream类型的参数,只要在调用打印信息的前面调用这二个方法重设输出流和错误流就可以达到我们的目的。因此,通过继承PrintStream类,并把要显示信息的组件作为参数传入到这个自定义的打印流类PrintStream中。
2. 代码示例

1 /**
2 * @author ypf
3 * @version 1.0
4 * Created on 2009-11-4
5 * Description: the override PrintStream for catching Java standard
6 * console output to SWT dialog's Text control.
7 */
8 publicclass ConsolePrintStream extends PrintStream {
9 private Text text;
10
11 public ConsolePrintStream(OutputStream out, Text text) {
12 super(out);
13 this.text = text;
14 }
15
16 /**
17 * 重截write方法,所有的打印方法都要调用的方法
18 */
19 publicvoid write(byte[] buf, int off, int len) {
20 final String message =new String(buf, off, len);
21 if (text !=null&&!text.isDisposed()) {
22 /* SWT非界面线程访问组件的方式 */
23 Display.getDefault().syncExec(new Thread() {
24 publicvoid run() {
25 /* 在这里把信息添加到组件中 */
26 text.append(message);
27 }
28 });
29 } else {
30 super.write(buf, off, len);
31 }
32 }
33 }
注意:确保GUI组件在调用打印信息添加前已经被正确创建的,另外必须注册不同GUI组件对线程的访问形式,像上面的SWT就对界面的访问有严格的规定。
3. 使用方法
在启动GUI界面程序之后,按照如下方式调用代码:

1 ConsolePrintStream cps=new ConsolePrintStream(System.out, text); // text为GUI组件
2
3 System.setOut(cps);
4
5 System.setErr(cps);
之后,Java标准输出和标准错误就被重定向到设置的GUI组件上了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架