Java 两个独立的控制台窗口用于输入和输出?

Java 两个独立的控制台窗口用于输入和输出?,java,Java,我有两个线程-一个等待输入,另一个正在打印调试信息 但是,只有一个控制台窗口,所以我不能键入“exit”(或任何停止进程的命令),因为System.out.println不断地打印内容。我可以为每个控制台分别设置两个单独的窗口吗 另外,我不想仅仅为了这个目的而使用Swing—必须有一种方法。我能想到的唯一方法是使用两个不同的进程,并在这两个进程之间建立链接。但我不知道该怎么做。也许您最好的选择是使用JOptionPane类 虽然您表示不想使用Swing,但我相信JOptionPane将是您的最佳

我有两个线程-一个等待输入,另一个正在打印调试信息

但是,只有一个控制台窗口,所以我不能键入“exit”(或任何停止进程的命令),因为
System.out.println
不断地打印内容。我可以为每个控制台分别设置两个单独的窗口吗


另外,我不想仅仅为了这个目的而使用Swing—必须有一种方法。

我能想到的唯一方法是使用两个不同的进程,并在这两个进程之间建立链接。但我不知道该怎么做。也许您最好的选择是使用JOptionPane类

虽然您表示不想使用Swing,但我相信JOptionPane将是您的最佳选择。简单地使用JOptionPane.showInputDialog是解决问题的一种快速方法

如果您真的不能使用Swing,则始终可以选择按Ctrl+C停止该过程

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

  • 您可以使用一个非常大的(可能是100000?)并将其存储为静态变量。您可以调用MyClass.out.println()而不是调用System.out.println()
  • 您可以使用覆盖系统。您可以创建自己的PrintWriter,它可以接受任何输入并将其发送到LinkedList(或者您自己为
    char
    s设计的LinkedList,如果您选择的话)。我建议您使用链表,因为对于链表,追加是O(1),而对于数组列表,追加是O(n)
  • 编辑:

    至于hmjd的建议(文件编写),您可以这样做:

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

    你的问题类似于,所以我认为答案是一样的。但是,可能对您来说是合适的。

    登录到一个文件,然后进入另一个窗口跟踪该文件(在unix/mac中使用“tail-f filename”,在另一个操作系统中——安装unix/cygwin!)

    这将使日志与控制台分开,并使其保持持久性


    有很多日志实用程序可以帮助您完成这项工作,甚至可以告诉您给定行来自哪个文件,从而提供更多帮助。

    将调试信息写入文件不是一个选项吗?你可以打开另一个控制台窗口,跟踪文件(进程退出后,你也会有调试信息)。这是一个选项,但我不记得怎么做。从答案来看,并没有简单的解决方案,所以我会尝试其中一些。但现在这不是问题,因为即使我手动终止端口,我的端口似乎也能正常关闭。我实际上使用了一个版本的替换stdout来在一个大系统中实现我自己的日志系统,以替换所有的system.out。真正酷的是,作为截获的一部分,我可以添加完成system.out的类文件/行号,并使用该信息实现过滤器(例如过滤消息,除非它们来自特定类或包含我的首字母[bk]…CPU时间非常昂贵,但在开发过程中,这通常并不重要,而且很容易在发货时关闭。@BillK您不能使用查找/替换工具吗?查找“System.out.print”,替换为“MyLogger.log”.但是截取是非常有用的。我假设您正在读取堆栈跟踪以找到类。对吗?是的。一个标志可以让我关闭堆栈跟踪。它的一部分是试图在不中断项目的其他部分的情况下解决问题-其中一些是打包在JAR中的,我们从未重新编译过(最初的目标是能够禁用选定的打包库)。另外,由于它是java 1.3版,所以我只有Exception.printStackTrace(),因此我的截获必须在另一个“system.out”中交换以捕获堆栈跟踪。。。