<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    網路冷眼@BlogJava

    熙熙攘攘一閑人 以冷靜的眼光觀察技術
    posts - 88, comments - 193, trackbacks - 0, articles - 28
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    幾乎所有的Java 集成開發環境都需要調用外部進程進行Java程序的構建,編譯,運行和調試,Eclipse,NetBeans,JBuilder和Intellij IDLE概莫例外。在執行過程中,將提示信息以黑色全部打印在控制臺里,將異常和錯誤以紅色方式打印。以非常醒目交互體驗讓程序員遠離枯燥和乏味。

    現在讓我們以Eclipse為例來看看它如何工作的,以揭開它神秘面紗,探究隱藏在后面的秘密。

    首先,我們準備一個Java 程序,程序如下所示:

     

    import  java.io.BufferedReader;
    import
     java.io.IOException;
    import
     java.io.InputStreamReader; 

    /**


    @author  lewhwa
    */



    public   class  HelloWorld { 

    public   static   void  main(String[] args)  throws
     IOException {
    System.out.println(
    " Where will you go to? "
    );
    InputStreamReader isr 
    =   new
     InputStreamReader(System.in);
    BufferedReader reader 
    =   new
     BufferedReader(isr);
    String name 
    =
     reader.readLine();
    if  (name.toUpperCase().equals( " HEAVEN "
    )) {
    System.out.println(
    " Welcome to heaven! "
    );
    }
    if  (name.toUpperCase().equals( " HELL "
    )){
    System.err.println(
    " Go away!here is hell "
    );
    }
    }
    }

    當運行程序等待輸入時,當輸入為“heaven”時。在Eclipse的控制臺輸出如圖1所示:

    圖1

    看來,在Eclipse控制臺的標準輸出(stdout,System.out)在控制臺中的顯示為為黑色;標準輸入(stdin,System.in)的顯示為綠色。那么,標準錯誤輸出是咋樣的呢?

    再次運行程序,當輸入為“Hell”時。在Eclipse的控制臺輸出如圖2所示:

    圖2

    哦,標準錯誤輸出(stderr,System.err)在Eclipse的控制臺輸出為綠色。

    我們知道,在Linux的Shell或者在Windows的Command Prompt窗口執行程序,可以在屏幕上打印stdin,stdout,stderr的消息。在Windows上執行時,將彈出一個Command Prompt窗口。在VC下寫過Console程序的應該知道,VC在執行這些程序時,也馬上彈出一個這樣的窗口。如果程序執行太快,將一閃而過。可是在諸如Eclipse之類的Java IDE里面,并沒有彈出這樣的窗口。我們禁不住要問,它們應用了什么技巧?

    無論VC,還是像Eclipse這樣的IDE,執行程序,實際上是在自己的進程里產生了另外一個子進程,這點誰也比誰強不了多少。但是,VC是直接將運行的console程序直接產生一個Command Prompt窗口。其輸入和輸出均放置到那個窗口里。而Eclipse則將這些輸入和輸出重定向到了自己的Console里。原來一直在像,Eclipse一定采用了什么動態鏈接庫之類的東東來做這些。

    直到有一天使用NetBeans,它完全使用Java,是純Java的。作為IDE,也是將Console程序的輸入和輸出均在IDE 自己Console顯示。這樣,我才明白,一定在Java API里有這樣的功能:能將外部程序的輸入和輸出進行攔截,然后在重定向到其它的地方。

    重新梳理了一下思路,原來使用過Runtime.exec()這樣的東東,是否所有的一切與之有關呢?但只是打開Notepad查看一下某個文本文件之類的應用,搞定也就pass了,沒有深究。

    仔細查了查這個類,終于發現了這個秘密。秘密就在Process這個類。Runtime.getRuntime.exec()執行外部程序后,將返回一個Process對象。Process有三個函數與此有關:

    getInputStream();

    getErrorStream();

    getOutputStream();

    到此,我們大概已經知道Process是Java IDE完成輸出輸入流攔截的關鍵所在。下篇,我們將利用此技術在自己的應用中實現這種技術。


    評論

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-01-15 09:44 by jrobot[匿名]
    - -api問題

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-01-15 12:25 by 三人行,必有我師焉
    失望……沒發現讓人感興趣的東西。

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-01-15 23:29 by 網路冷眼@BlogJava
    @jrobot[匿名]
    何嘗不是API,豈止是API?
    歡迎看看下篇!

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-01-15 23:30 by 網路冷眼@BlogJava
    @三人行,必有我師焉
    歡迎看看下篇!看看是否讓你感興趣的東東!

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)[未登錄]  回復  更多評論   

    2007-01-16 10:32 by J
    看到這篇,就不用看下篇了

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-01-16 18:29 by 網路冷眼@BlogJava
    @J
    老兄真神人也!

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-04-06 20:18 by 路人甲
    感謝樓主的分享,我覺得挺有用的

    # re: Java調用外部進程并攔截輸入輸出流--Java IDE Console解密(上篇)  回復  更多評論   

    2007-04-13 15:41 by 路人乙
    @路人甲
    謝謝!
    主站蜘蛛池模板: 亚洲午夜福利在线视频| 亚洲AV中文无码字幕色三| 亚洲高清乱码午夜电影网| 国产成人精品免费视频大全麻豆| 亚洲av不卡一区二区三区| 99精品视频在线视频免费观看| 亚洲国产精品久久久久婷婷老年 | 一级毛片**不卡免费播| 亚洲AV中文无码字幕色三| 色欲国产麻豆一精品一AV一免费 | 亚洲娇小性色xxxx| 永久久久免费浮力影院| 疯狂做受xxxx高潮视频免费| 亚洲精品国产自在久久| 国产无遮挡无码视频免费软件| 亚洲视频在线观看不卡| 国产免费av片在线看| 国产亚洲高清在线精品不卡| 亚洲中文字幕无码日韩| 2015日韩永久免费视频播放| 亚洲国产精品自在自线观看| 亚洲а∨天堂久久精品| 日韩免费在线观看视频| xxx毛茸茸的亚洲| 亚洲国产精品一区二区九九| 无码人妻丰满熟妇区免费| 亚洲人成小说网站色| 亚洲国产成人久久一区久久| 香蕉成人免费看片视频app下载 | 美女被暴羞羞免费视频| 亚洲AV无码一区二区二三区软件 | 少妇亚洲免费精品| 亚洲av伊人久久综合密臀性色 | 精品亚洲aⅴ在线观看| 在线免费视频一区二区| caoporm超免费公开视频| 亚洲国产精品白丝在线观看| 亚洲午夜精品一级在线播放放| 91人人区免费区人人| 添bbb免费观看高清视频| 日韩精品亚洲人成在线观看 |