2012-02-20 67 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的!)

這樣可以使你的日誌分開從您的控制檯,並使其持久。

有很多的日誌實用程序在那裏,這將有助於本,甚至會幫助更多的告訴你一點什麼文件給定線的來源。