在 J a v a 程序中截获控制台输出 在 Java开发中,控制台输出仍是一个重要的工具,但默认的控制台输出有着各种各样的局限。本文介绍如何用 Java 管道流截取控制台输出,分析管道流应用中应该注意的问题,提供了截取Java 程序和非 Java 程序控制台输出的实例。 即使在图形用户界面占统治地位的今天,控制台输出仍旧在Java程序中占有重要地位。控制台不仅是Java 程序默认的堆栈跟踪和错误信息输出窗口,而且还是一种实用的调试工具(特别是对习惯于使用println()的人来说)。然而,控制台窗口有着许多局限。例如在Windows 9x平台上,DOS 控制台只能容纳50 行输出。如果Java程序一次性向控制台输出大量内容,要查看这些内容就很困难了。 对于使用 javaw 这个启动程序的开发者来说,控制台窗口尤其宝贵。因为用javaw 启动java 程序时,根本不会有控制台窗口出现。如果程序遇到了问题并抛出异常,根本无法查看 Java 运行时环境写入到System.out 或System.err 的调用堆栈跟踪信息。为了捕获堆栈信息,一些人采取了用 try/catch()块封装main()的方式,但这种方式不一定总是有效,在 Java 运行时的某些时刻,一些描述性错误信息会在抛出异常之前被写入 System.out 和 System.err;除非能够监测这两个控制台流,否则这些信息就无法看到。 因此,有些时候检查 Java 运行时环境(或第三方程序)写入到控制台流的数据并采取合适的操作是十分必要的。本文讨论的主题之一就是创建这样一个输入流,从这个输入流中可以读入以前写入Java 控制台流(或任何其他程序的输出流)的数据。我们可以想象写入到输出流的数据立即以输入的形式“回流”到了 Java 程序。 本文的目标是设计一个基于 Swing 的文本窗口显示控制台输出。在此期间,我们还将讨论一些和 Java管道流(PipedInputStream 和 PipedOutputStream)有关的重要注意事项。图一显示了用来截取和显示控制台文本输出的 Java 程序,用户界面的核心是一个 JTextArea。最后,我们还要创建一个能够捕获和显示其他程序(可以是非 Java 的程序)控制台输出的简单程序。 一、Java 管道流 要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流。换句话说,我们要有一种高效地读取写入到System.out 和 System.err 所有内容的方法。如果你熟悉 Java 的管道流 PipedInputStream 和PipedOutputStream,就会相信我们已经拥有最有效的工具。 写入到Pip...