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