======================================================
注:本文源代码点此下载
======================================================
以前在使用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 public class consoleprintstream extends printstream {
9private text text;
10
11public consoleprintstream(outputstream out, text text) {
12super(out);
13this.text = text;
14}
15
16/**
17* 重截write方法,所有的打印方法都要调用的方法
18*/
19public void write(byte[] buf, int off, int len) {
20final string message = new string(buf, off, len);
21if (text != null && !text.isdisposed()) {
22/*swt非界面线程访问组件的方式*/
23display.getdefault().syncexec(new thread() {
24public void run() {
25/*在这里把信息添加到组件中*/
26text.append(message);
27}
28});
29} else {
30super.write(buf, off, len);
31}
32}
33 }
注意:确保gui组件在调用打印信息添加前已经被正确创建的,另外必须注册不同gui组件对线程的访问形式,像上面的swt就对界面的访问有严格的规定。
3. 使用方法
在启动gui界面程序之后,按照如下方式调用代码:

view code
1 consoleprintstream cps=newconsoleprintstream(system.out, text); // text为gui组件
2
3 system.setout(cps);
4
5 system.seterr(cps);
之后,java标准输出和标准错误就被重定向到设置的gui组件上了。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
本文介绍了一种在Java中将标准输出流和错误流重定向到GUI组件的方法,通过自定义PrintStream类实现,适用于多线程环境下的Eclipse插件开发。
248

被折叠的 条评论
为什么被折叠?



