亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

在Java程序中截獲控制臺輸出

2019-11-18 13:37:12
字體:
來源:轉載
供稿:網友

  在java程序中截獲控制臺輸出






  
  
  
  








俞良松 (javaman@163.net)
軟件工程師,獨立顧問和自由撰稿人
2001 年 10 月

在Java開發中,控制臺輸出仍是一個重要的工具,但默認的控制臺輸出有著各種各樣的局限。本文介紹如何用Java管道流截取控制臺輸出,分析管道流應用中應該注重的問題,提供了截取Java程序和非Java程序控制臺輸出的實例。
即使在圖形用戶界面占統治地位的今天,控制臺輸出仍然在Java程序中占有重要地位??刂婆_不僅是Java程序默認的堆棧跟蹤和錯誤信息輸出窗口,而且還是一種實用的調試工具(非凡是對習慣于使用PRintln()的人來說)。然而,控制臺窗口有著許多局限。例如在Windows 9x平臺上,DOS控制臺只能容納50行輸出。假如Java程序一次性向控制臺輸出大量內容,要查看這些內容就很困難了。

對于使用javaw這個啟動程序的開發者來說,控制臺窗口尤其寶貴。因為用javaw啟動java程序時,根本不會有控制臺窗口出現。假如程序碰到了問題并拋出異常,根本無法查看Java運行時環境寫入到System.out或System.err的調用堆棧跟蹤信息。為了捕捉堆棧信息,一些人采取了用try/catch()塊封裝main()的方式,但這種方式不一定總是有效,在Java運行時的某些時刻,一些描述性錯誤信息會在拋出異常之前被寫入System.out和System.err;除非能夠監測這兩個控制臺流,否則這些信息就無法看到。

因此,有些時候檢查Java運行時環境(或第三方程序)寫入到控制臺流的數據并采取合適的操作是十分必要的。本文討論的主題之一就是創建這樣一個輸入流,從這個輸入流中可以讀入以前寫入Java控制臺流(或任何其他程序的輸出流)的數據。我們可以想象寫入到輸出流的數據立即以輸入的形式“回流”到了Java程序。

本文的目標是設計一個基于Swing的文本窗口顯示控制臺輸出。在此期間,我們還將討論一些和Java管道流(PipedInputStream和PipedOutputStream)有關的重要注重事項。圖一顯示了用來截取和顯示控制臺文本輸出的Java程序,用戶界面的核心是一個JTextArea。最后,我們還要創建一個能夠捕捉和顯示其他程序(可以是非Java的程序)控制臺輸出的簡單程序。


圖一:多線程的控制臺輸出截取程序



一、Java管道流
要在文本框中顯示控制臺輸出,我們必須用某種方法“截取”控制臺流。換句話說,我們要有一種高效地讀取寫入到System.out和System.err所有內容的方法。假如你熟悉Java的管道流PipedInputStream和PipedOutputStream,就會相信我們已經擁有最有效的工具。

寫入到PipedOutputStream輸出流的數據可以從對應的PipedInputStream輸入流讀取。Java的管道流極大地方便了我們截取控制臺輸出。Listing 1顯示了一種非常簡單的截取控制臺輸出方案。

【Listing 1:用管道流截取控制臺輸出】
PipedInputStream pipedIS = new PipedInputStream();
PipedOutputStream pipedOS = new PipedOutputStream();
try {
pipedOS.connect(pipedIS);
}
catch(IOException e) {
System.err.println("連接失敗");
System.exit(1);
}
PrintStream ps = new PrintStream(pipedOS);
System.setOut(ps);
System.setErr(ps);






可以看到,這里的代碼極其簡單。我們只是建立了一個PipedInputStream,把它設置為所有寫入控制臺流的數據的最終目的地。所有寫入到控制臺流的數據都被轉到PipedOutputStream,這樣,從相應的PipedInputStream讀取就可以迅速地截獲所有寫入控制臺流的數據。接下來的事情似乎只剩下在Swing JTextArea中顯示從pipedIS流讀取的數據,得到一個能夠在文本框中顯示控制臺輸出的程序。遺憾的是,在使用Java管道流時有一些重要的注重事項。只有認真對待所有這些注重事項才能保證Listing 1的代碼穩定地運行。下面我們來看第一個注重事項。

1.1 注重事項一
PipedInputStream運用的是一個1024字節固定大小的循環緩沖區。寫入PipedOutputStream的數據實際上保存到對應的PipedInputStream的內部緩沖區。從PipedInputStream執行讀操作時,讀取的數據實際上來自這個內部緩沖區。假如對應的PipedInputStream輸入緩沖區已滿,任何企圖寫入PipedOutputStream的線程都將被阻塞。而且這個寫操作線程將一直阻塞,直至出現讀取PipedInputStream的操作從緩沖區刪除數據。

這意味著,向PipedOutputStream寫數據的線程不應該是負責從對應PipedInputStream讀取數據的唯一線程。從圖二可以清楚地看出這里的問題所在:假設線程t是負責從PipedInputStream讀取數據的唯一線程;另外,假定t企圖在一次對PipedOutputStream的write()方法的調用中向對應的PipedOutputStream寫入2000字節的數據。在t線程阻塞之前,它最多能夠寫入1024字節的數據(PipedInputStream內部緩沖區的大?。?。然而,一旦t被阻塞,讀取PipedInputStream的操作就再也不會出現,因為t是唯一讀取PipedInputStream的線程。這樣,t線程已經完全被阻塞,同時,所有其他試圖向PipedOutputStream寫入數據的線程也將碰到同樣的情形。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久91| 精品视频在线播放色网色视频| 日韩欧美在线视频观看| 日韩中文字幕在线免费观看| 亚洲欧美日韩高清| 国产午夜精品麻豆| 国产91精品久久久久久| 亚洲欧美日韩国产精品| 欧美视频二区36p| 亚洲va久久久噜噜噜久久天堂| 亚洲欧洲在线免费| 亚洲色图校园春色| 欧美精品激情在线| 欧美日韩黄色大片| 国产精品久久久久久久久久99| 久久久亚洲国产| 国产91精品视频在线观看| 亚洲国产日韩一区| 国产91在线播放| 日韩电影中文字幕在线| 亚洲精品国产精品自产a区红杏吧| 青青草成人在线| …久久精品99久久香蕉国产| 精品国内亚洲在观看18黄| 91黑丝在线观看| 亚洲欧美精品suv| 久久99精品久久久久久噜噜| 亚洲天堂2020| 亚洲天堂成人在线| 97国产精品免费视频| 亚洲的天堂在线中文字幕| 欧美激情第6页| 97久久精品人人澡人人爽缅北| 亚洲天堂一区二区三区| 国产精品免费久久久| 午夜精品久久久99热福利| 欧美视频免费在线观看| 国产成人综合精品| 欧美日韩国产丝袜另类| 欧美日韩精品在线观看| 精品国产一区二区三区久久久狼| 国产视频福利一区| 中文字幕av一区二区| 亚洲精品国产电影| 亚洲一级黄色av| 国模gogo一区二区大胆私拍| 97在线观看视频| 色偷偷偷综合中文字幕;dd| 2019中文字幕在线免费观看| 国产视频一区在线| 成人在线免费观看视视频| 伊人久久久久久久久久久久久| 久久九九有精品国产23| 欧美另类老肥妇| 久久久久久久久亚洲| 亚洲综合视频1区| 欧美国产日韩一区二区三区| 久久精品中文字幕免费mv| 亚洲人成网站色ww在线| 中文字幕日韩在线观看| 欧美性猛交xxxx| 日韩av免费看| 欧美大片大片在线播放| 中文字幕亚洲一区在线观看| 日本中文字幕久久看| 久久久亚洲欧洲日产国码aⅴ| 久久av中文字幕| 亚洲高清福利视频| 国产精品一区二区三区毛片淫片| 亚洲女人被黑人巨大进入al| 亚洲人成网站在线播| 亚洲一区中文字幕| 亚洲国产精品国自产拍av秋霞| 91探花福利精品国产自产在线| 欧美老妇交乱视频| 国产精品老牛影院在线观看| 国产一区二区黄| 日本久久久久久| 亚洲精品av在线| 国产福利视频一区二区| 精品国产91久久久久久老师| 日韩在线视频观看正片免费网站| 欧美小视频在线| 亚洲日韩欧美视频| 国产精品美乳一区二区免费| 精品在线观看国产| 久久夜色精品亚洲噜噜国产mv| 一区二区国产精品视频| 青青a在线精品免费观看| 久久免费福利视频| 久久久久久久激情视频| 成人做爰www免费看视频网站| 亚洲一区二区三区成人在线视频精品| 高清亚洲成在人网站天堂| 精品中文字幕久久久久久| 亚洲精品免费一区二区三区| 在线成人一区二区| 国产日韩在线看| 国产精品成人在线| 亚洲高清久久久久久| 中文日韩电影网站| 欧美激情一区二区三区久久久| 欧美成人性色生活仑片| 亚州欧美日韩中文视频| 亚洲第一精品夜夜躁人人爽| 欧美日韩精品在线观看| 亚洲人成在线播放| 欧美成年人视频网站| 亚洲人成电影网| 九九热精品在线| 亚洲四色影视在线观看| 欧美中文字幕在线视频| 国产性猛交xxxx免费看久久| 亚洲一区二区日本| 欧洲亚洲妇女av| 国产精品自在线| 国产成人综合一区二区三区| 亚洲精品久久久久| 美女视频黄免费的亚洲男人天堂| 热99精品里视频精品| 在线观看免费高清视频97| 在线播放日韩专区| 成人中文字幕在线观看| 欧美亚洲国产精品| 久久精品国产96久久久香蕉| 久久亚洲精品成人| 欧美日韩国产一区在线| 久久久久久一区二区三区| 一本一道久久a久久精品逆3p| 国产伦精品一区二区三区精品视频| 日韩国产欧美精品在线| 国产视频精品自拍| 亚洲国产一区二区三区在线观看| 一夜七次郎国产精品亚洲| 中文字幕日韩综合av| 久99九色视频在线观看| 136fldh精品导航福利| 中文字幕亚洲欧美日韩在线不卡| 亚洲精品国偷自产在线99热| 岛国视频午夜一区免费在线观看| 久久久久久久久久久av| 午夜美女久久久久爽久久| 日韩经典一区二区三区| 国产成人精品免费久久久久| 国产精品久久久久国产a级| 欧美午夜片欧美片在线观看| 欧美另类69精品久久久久9999| 国产精品劲爆视频| 亚洲变态欧美另类捆绑| 久久免费少妇高潮久久精品99| 欧美高清视频一区二区| 在线精品国产欧美| 97免费视频在线| 亚洲国产精品人人爽夜夜爽| 日韩欧美亚洲国产一区| 麻豆成人在线看| 国产99久久精品一区二区| 亚洲女人被黑人巨大进入al| 一本色道久久综合亚洲精品小说| 国产精品91一区| 国产精品久久久久久久天堂| 亚洲欧美国产制服动漫| 国产精品亚洲第一区| 日韩精品在线第一页|