在java程序中截获控制台输出

在java程序中截获控制台输出

ID:34753476

大小:138.68 KB

页数:15页

时间:2019-03-10

在java程序中截获控制台输出_第1页
在java程序中截获控制台输出_第2页
在java程序中截获控制台输出_第3页
在java程序中截获控制台输出_第4页
在java程序中截获控制台输出_第5页
资源描述:

《在java程序中截获控制台输出》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、在Java程序中截获控制台输出在Java开发中,控制台输出仍是一个重要的工具,但默认的控制台输出有着各种各样的局限。本文介绍如何用Java管道流截取控制台输出,分析管道流应用中应该注意的问题,提供了截取Java程序和非Java程序控制台输出的实例。  即使在图形用户界面占统治地位的今天,控制台输出仍旧在Java程序中占有重要地位。控制台不仅是Java程序默认的堆栈跟踪和错误信息输出窗口,而且还是一种实用的调试工具(特别是对习惯于使用println()的人来说)。然而,控制台窗口有着许多局限。例如在Windows9x平台上,DOS控制台只能容纳50行输出。如

2、果Java程序一次性向控制台输出大量内容,要查看这些内容就很困难了。  对于使用javaw这个启动程序的开发者来说,控制台窗口尤其宝贵。因为用javaw启动java程序时,根本不会有控制台窗口出现。如果程序遇到了问题并抛出异常,根本无法查看Java运行时环境写入到System.out或System.err的调用堆栈跟踪信息。为了捕获堆栈信息,一些人采取了用try/catch()块封装main()的方式,但这种方式不一定总是有效,在Java运行时的某些时刻,一些描述性错误信息会在抛出异常之前被写入System.out和System.err;除非能够监测这两个

3、控制台流,否则这些信息就无法看到。  因此,有些时候检查Java运行时环境(或第三方程序)写入到控制台流的数据并采取合适的操作是十分必要的。本文讨论的主题之一就是创建这样一个输入流,从这个输入流中可以读入以前写入Java控制台流(或任何其他程序的输出流)的数据。我们可以想象写入到输出流的数据立即以输入的形式“回流”到了Java程序。  本文的目标是设计一个基于Swing的文本窗口显示控制台输出。在此期间,我们还将讨论一些和Java管道流(PipedInputStream和PipedOutputStream)有关的重要注意事项。图一显示了用来截取和显示控制台

4、文本输出的Java程序,用户界面的核心是一个JTextArea。最后,我们还要创建一个能够捕获和显示其他程序(可以是非Java的程序)控制台输出的简单程序。  一、Java管道流  要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流。换句话说,我们要有一种高效地读取写入到System.out和System.err所有内容的方法。如果你熟悉Java的管道流PipedInputStream和PipedOutputStream,就会相信我们已经拥有最有效的工具。  写入到PipedOutputStream输出流的数据可以从对应的PipedInputS

5、tream输入流读取。Java的管道流极大地方便了我们截取控制台输出。Listing1显示了一种非常简单的截取控制台输出方案。【Listing1:用管道流截取控制台输出】PipedInputStreampipedIS=newPipedInputStream();PipedOutputStreampipedOS=newPipedOutputStream();try{pipedOS.connect(pipedIS);}catch(IOExceptione){System.err.println("连接失败");System.exit(1);}PrintStre

6、amps=newPrintStream(pipedOS);System.setOut(ps);System.setErr(ps);  可以看到,这里的代码极其简单。我们只是建立了一个PipedInputStream,把它设置为所有写入控制台流的数据的最终目的地。所有写入到控制台流的数据都被转到PipedOutputStream,这样,从相应的PipedInputStream读取就可以迅速地截获所有写入控制台流的数据。接下来的事情似乎只剩下在SwingJTextArea中显示从pipedIS流读取的数据,得到一个能够在文本框中显示控制台输出的程序。遗憾的是,

7、在使用Java管道流时有一些重要的注意事项。只有认真对待所有这些注意事项才能保证Listing1的代码稳定地运行。下面我们来看第一个注意事项。  1.1注意事项一  PipedInputStream运用的是一个1024字节固定大小的循环缓冲区。写入PipedOutputStream的数据实际上保存到对应的PipedInputStream的内部缓冲区。从PipedInputStream执行读操作时,读取的数据实际上来自这个内部缓冲区。如果对应的PipedInputStream输入缓冲区已满,任何企图写入PipedOutputStream的线程都将被阻塞。而且

8、这个写操作线程将一直阻塞,直至出现读取PipedInputStre

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。