2012-02-20 69 views
2

我有两个线程 - 一个等待输入,另一个打印调试信息。两个独立的控制台窗口用于输入和输出?

但是只有一个控制台窗口,所以我不能键入“exit”(或任何停止的过程),因为System.out.println不断打印的东西。我可以有两个单独的控制台窗口吗?

P.S.我不想仅仅为了这个目的而使用Swing - 一定有办法。

+3

是否将调试信息写入文件而不是选项?你可以打开另一个控制台窗口并拖拽文件(在进程退出后你也可以获得调试信息)。 – hmjd 2012-02-20 22:41:04

+0

以及它是一个选项,但我不记得如何做到这一点。从答案来看,虽然没有小事,但我会尝试其中的一些。但现在它不是一个问题,因为即使手动终止它,我的端口似乎也能正常关闭。 – Aubergine 2012-02-21 14:48:52

回答

3

我能想到的唯一办法是有两个区别的流程和betweeen这两个过程的链接。但我不知道如何做到这一点。也许你最好的选择是使用JOptionPane类。

虽然你说你不想使用Swing,我相信JOptionPane的将是你最好的选择。只需使用JOptionPane.showInputDialog是解决问题的快速方法。 Here's a link to JOptionPane's JavaDoc

如果你真的不能使用Swing,总有按Ctrl + C停止进程的选项。

最后一个选择是缓冲输出并只在输入后写入。在收到输入后,您将刷新缓冲区,然后处理输入。以这种方式,您可以防止应用程序在刷新缓冲区之前关闭。有两种方法可以做到这一点:

  1. 您可以使用BufferedWriter具有非常大的尺寸(可能是10万?),这存储为静态变量。而不是调用的System.out.println(),你可以调用MyClass.out.println()
  2. 你可以使用System.setOut()覆盖系统。您可以创建自己的PrintWriter,它可以接受任何输入并将其发送给LinkedList(或者您自己的LinkedList,如果您愿意,可以为char设计)。我建议你使用链表,因为对于链表,追加是O(1),而对于数组列表追加是O(n)。

编辑:

至于hmjd的建议(文件写入),你会是这样做的:

System.setOut(new FileWriter(new File(myFileName))); 
+2

我实际上使用了一个替换stdout的版本来实现我自己的系统中的日志系统来替换所有的system.outs。非常酷的事情是,作为拦截的一部分,我可以添加执行system.out的类文件/行号,并使用该信息来实现过滤器(例如过滤消息,除非它们来自特定的类或除非它们包含我的首字母缩写[bk] ...非常昂贵的CPU时间,但在开发过程中通常无关紧要,并且可能很容易关闭发货 – 2012-02-20 22:54:09

+0

@BillK难道你不能只使用查找/替换工具吗?找到“系统”。 out.print“替换为”MyLogger.log“,但拦截是非常有用的,我假设你正在读取堆栈跟踪以找到类,是否正确? – 2012-02-20 23:03:04

+0

是的,一个标志会让我关闭堆栈它的部分原因是在不中断项目的其他部分的情况下解决问题 - 其中一些部分被封装在Jars中,我们从未重新编译(最初的目标是能够将选定的prpackaged库静音)。是java版本1.3我所有的是Exception.printSta ckTrace()所以我的拦截必须在不同的“system.out”中实际交换以捕获堆栈跟踪... – 2012-02-21 17:07:29

3

登录到文件,然后进入另一个窗口和尾部的文件(在UNIX/Mac上使用“尾-f文件名”,在另一个操作系统 - 安装UNIX/cygwin的!)

这样可以使你的日志分开从您的控制台,并使其持久。

有很多的日志实用程序在那里,这将有助于本,甚至会帮助更多的告诉你一点什么文件给定线的来源。