p; try {
sleep(1000);
m_lt.stopThread();
m_pipedOut.close();
}
catch (InterruptedException e) {
m_lt.stopThread();
e.printStackTrace(m_tempErr);
}
catch (IOException e) {
m_lt.stopThread();
e.printStackTrace(m_tempErr);
}
/* restore to the old streams */
System.setOut(m_tempOut);
System.setErr(m_tempErr);
}
… …… ……
}
从上面的代码中的public void run() 方法中可以看出系统的确用该类来处理文件导入的工作。主要分为一下几个步骤来完成。这里就验证了我们前面name为display的frame向用户显示处理结果的,name 为data 的frame来处理文件导入的猜想。。
1、 备份系统的标准输出和系统的错误输出
m_tempOut = System.out;
m_tempErr = System.err;
2、 将系统输出重新定向到一个PipedOutputStream实例(instance)
System.setOut(new PrintStream(m_pipedOut));
System.setErr(new PrintStream(m_pipedOut));
这样一来说有的系统输出都会定向到m_pipedOut到这个对象上来了。要显示处理信息只需要处理是用System.out.println()之类方法打印出来。在前面读取m_pipedOut就可以了。是不是这样实现还有待证实。
3、 启动 CmsSetupLoggingThread 线程;
4、 开始导入工作。有代码为证
/* start importing the workplace */
CmsMain.startSetup(basePath + "WEB-INF/ocsetup/cmssetup.txt", basePath + "WEB-INF/");
5、 停止CmsSetupLoggingThread 线程。
6、 还原系统的标准输出和系统的错误输出。
下面就是还不清楚CmsSetupLoggingThread到底是什么玩意。通过查看源码可以发现他就是用来收集CmsSetupThread线程的处理信息的。并且就是通过PipedOutputStream来完成这两个线程的通信。这一点可以从他的构造函数知道。
public CmsSetupLoggingThread(PipedOutputStream pipedOut) {
messages = new Vector();
m_stopThread = false;
try {
m_pipedIn = new PipedInputStream();
m_pipedIn.connect(pipedOut);
m_LineReader = new LineNumberReader(new BufferedReader(new