簡體   English   中英

將另一個程序的輸出打印到java文本區域

[英]Printing output of another program to a java text area

我正在使用Java創建GUI。 此GUI使用ProcessBuilder類從命令行啟動程序。

有關正在啟動的進程的一些信息:從命令行,它創建另一個窗口並將信息打印到所述窗口。

在我的GUI窗口中,我有一個文本區域,我想重定向所述輸出。 我原本打算使用SwingWorker對象來不斷檢查更多輸出而不是阻止GUI。 為了測試並確保我原來的語法已經關閉(甚至沒有將GUI帶入事物中)我想我會將輔助進程窗口的輸出打印到System.out。 但是,有些東西似乎是錯誤的,因為我可以在輔助進程的窗口中看到輸出,但不是我正在工作的終端。

代碼摘錄如下:

Process p = pb.start(); 
Scanner s = new Scanner(p.getInputStream());

SwingWorker pipe = new SwingWorker<String, Void> (){
    public String doInBackground(){
        while(run){
            if(s.hasNextLine()){
                System.out.println("S has next!");
                System.out.println(s.nextLine());
            }
        }
        return null;
    }
};
pipe.execute();

布爾運行在程序的其他地方定義,並在進程p退出或強制退出時設置為false(另外一個問題:這是一個非常糟糕的主意嗎?我覺得它可能是......)。

當我看到它被打印到另一個窗口時,有沒有人知道為什么我從來沒有得到任何輸出? 最初我的反應是使用p.getOutputStream()但Scanner不會將outputStream作為參數。

感謝您的時間。

您還應該掃描p.getErrorStream() - 某些程序寫入STDERR,從命令行運行時與STDOUT無法區分。 通常很好的做法是同時使用兩個流,就好像任何一個流都沒有被消耗它可能導致外部進程掛起。

如果外部進程正在將其輸出寫入其自己的窗口,則幾乎可以肯定輸出未寫入STDOUT,這是您使用代碼讀取的內容。 如果它這樣做,則外部程序的輸出將出現在其窗口和啟動它的命令行會話中(如果存在)。 如果不訪問外部程序的源代碼,除非作者為該功能做出規定(即將輸出重定向到STDOUT而不是窗口的命令行開關),否則您不太可能截取其輸出。

至於p.getOutputStream() ,它從你的角度返回一個“輸出”的流 - 即你寫入它以將數據發送到進程'STDIN。 對外部程序寫入STDOUT的情況,使用p.getInputStream()是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM