我创建了一个swing ui,并将System.out和System.err重定向到带有此代码的文本字段
ConsoleOutputStream cos = new ConsoleOutputStream(textColor, printStream);
System.setOut( new PrintStream(cos, true) );
ConsoleOutputStream扩展了ByteArrayOutputStream,只要在新线程中没有执行任何操作,它就会按预期工作。
但是,我的应用程序执行第三方jar文件,而后者又会创建新线程。当这些线程打印到System.out时,它会在启动我的应用程序的终端中打印,而不是在我的文本字段中打印。我查看了这个链接:http://maiaco.com/articles/java/threadOut.php但我不确定它是否适用于我的问题,因为我对线程无法控制。至于我的应用程序知道没有创建任何线程(主gui线程除外)。
有没有办法重定向所有System.out:s和System.err:s独立于线程?如果没有,我可以听取对System.out的调用,然后将它们打印到我的文本字段吗?我是否可以听取我启动应用程序的终端并将其中的所有输出重定向到我的应用程序?
答案 0 :(得分:4)
System.out
不是特定于线程的。有两种可能性:
在重定向并缓存值之前,库会读取System.out
。修复方法是在调用第三方库代码之前重定向System.out
。
图书馆不使用System.out
。对于写入控制台,还有其他选择,例如创建new FileOutputStream(FileDescriptor.out)
并写入它。或者使用System.console()
。
如果通过其中一个已知的日志记录API发生这种情况,您可以通过删除默认的控制台写日志处理程序并安装自己的日志处理程序来覆盖该行为否则它很难做到。您必须仔细研究这些库及其API,以了解如何进行操作。每个复杂的库都提供了一种将消息直接写入控制台的方法,而不提供替代方案是一种非常糟糕的编程风格,尤其是对于库而言。
您使用的库很可能使用日志记录API。