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

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

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

    網(wǎng)路冷眼@BlogJava

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

    幾乎所有的Java 集成開發(fā)環(huán)境都需要調(diào)用外部進(jìn)程進(jìn)行Java程序的構(gòu)建,編譯,運(yùn)行和調(diào)試,Eclipse,NetBeans,JBuilder和Intellij IDLE概莫例外。在執(zhí)行過程中,將提示信息以黑色全部打印在控制臺里,將異常和錯(cuò)誤以紅色方式打印。以非常醒目交互體驗(yàn)讓程序員遠(yuǎn)離枯燥和乏味。

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

    上篇主要介紹了JAVA IDE Console通過采用Runtime.getRuntime.exec()執(zhí)行外部程序后,將返回一個(gè)Process對象. Process對象能返回三個(gè)流:

    getInputStream(),對應(yīng)Process程序的標(biāo)準(zhǔn)輸出流。

    getErrorStream(), 對應(yīng)Process程序的標(biāo)準(zhǔn)錯(cuò)誤輸出流。

    getOutputStream();對應(yīng)Process程序的標(biāo)準(zhǔn)輸入流。

    函數(shù)名之所以與Process程序的方向相反,原因是站在Java Host程序的角度講的。

    現(xiàn)在我們應(yīng)用此原理來仿真IDE 執(zhí)行外部程序的過程。

    列表1:ConsoleSimulator.java

    package  helloworld;

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

    /**
     * Class for console simulation
     * 
     * 
    @author  lewhwa
     
    */
    public   class  ConsoleSimulator  implements  Runnable {
        
    private   volatile   boolean  isStop  =   false ;

        
    private   static   final   int  INFO  =   0 ;

        
    private   static   final   int  ERROR  =   1 ;

        
    private  InputStream is;

        
    private   int  type;

        
    /**  Creates a new instance of StreamInterceptor  */
        
    public  ConsoleSimulator(InputStream is,  int  type) {
            
    this .is  =  is;
            
    this .type  =  type;
        }

        
    public   void  run() {
            InputStreamReader isr 
    =   new  InputStreamReader(is);
            BufferedReader reader 
    =   new  BufferedReader(isr);
            String s;
            
    try  {
                
    while  (( ! isStop)  &&  (s  =  reader.readLine())  !=   null ) {
                    
    if  (s.length()  !=   0 ) {
                        
    if  (type  ==  INFO) {
                            System.out.println(
    " INFO> "   +  s);
                        } 
    else  {
                            System.err.println(
    " ERROR> "   +  s);
                        }
                        
    try  {
                            Thread.sleep(
    10 );
                        } 
    catch  (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            } 
    catch  (IOException ex) {
                ex.printStackTrace();
            }
        }

        
    public   void  stop() {
            isStop 
    =   true ;
        }

        
    public   static   void  main(String[] args)  throws  IOException,
                InterruptedException {
            
    // Process child = Runtime.getRuntime().exec("run.bat");
            Process child = Runtime.getRuntime().exec( " java -classpath bin helloworld.Test " );
            OutputStream os 
    =  child.getOutputStream();
            InputStream stdin 
    =  child.getInputStream(); //
            InputStream stderr  =  child.getErrorStream();
            Thread tIn 
    =   new  Thread( new  ConsoleSimulator(stdin, INFO));
            Thread tErr 
    =   new  Thread( new  ConsoleSimulator(stderr, ERROR));
            tIn.start();
            tErr.start();
            
    int  result  =  child.waitFor();
            tIn.join();
            tErr.join();
            
    if  (result  ==   0 ) {
                System.out.println(
    " SUCCESS! " );
            } 
    else  {
                System.out.println(
    " FAILED! " );
            }
        }
    }

    外部Bat文件:

    列表2

    time  / t
    cmd.exe 
    / / Q copy 
    javac
    cmd.exe 
    / C tree
    rem c:\Designer_v5.
    1 .0_win32_x86.exe c:\Designer_v5. 1 .0_win32_x861.exe
    time 
    / t

    測試Java類Test.java

    列表3:

     

     

    package helloworld;

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;


    /**Test Class
     * 
    @author lewhwa
     * 
     
    */
    public class Test {

        
    public static void main(String[] args) throws IOException {

            FileReader fir 
    = new FileReader("src/helloworld/Test1.java");
            BufferedReader br 
    = new BufferedReader(fir);
            String s;
            
    while((s=br.readLine())!=null){
                System.out.println(s);
            }
            fir.close();
        }

    }

    當(dāng)ConsoleSimulator程序執(zhí)行外部的run.bat時(shí),輸出如圖1所示:

    圖1

    當(dāng)ConsoleSimulator程序執(zhí)行外部的java test正常時(shí),輸出如圖2所示:

     

    圖2

    當(dāng)ConsoleSimulator程序執(zhí)行外部的java test發(fā)生異常時(shí),輸出如圖3所示:

    圖3

    綜上,雖然沒有在自己的GUI里將stdout和stderr進(jìn)行說明,只是用ERROR>提示符和INFO>提示符進(jìn)行演示,但是完全I(xiàn)DE Console的原理。對ConsoleSimulator稍加修改,完全放入到自己的應(yīng)用程序當(dāng)中去。

    在我們進(jìn)行Java程序開發(fā)的過程當(dāng)中,可能涉及到其它的應(yīng)用程序,借助這種技術(shù),可以很好利用它們,將它們集成到自己的應(yīng)用當(dāng)中,將極大地縮短開發(fā)周期,何樂而不為呢!


    評論

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)  回復(fù)  更多評論   

    2007-05-07 08:47 by ddd
    在我們進(jìn)行Java程序開發(fā)的過程當(dāng)中,可能涉及到其它的應(yīng)用程序,借助這種技術(shù),可以很好利用它們,將它們集成到自己的應(yīng)用當(dāng)中,將極大地縮短開發(fā)周期,何樂而不為呢!

    根本不明白上面這些的意思。。。有現(xiàn)成的不用, 非要自己去寫, 還改叫極大的縮短開發(fā)周期。。。

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)  回復(fù)  更多評論   

    2008-03-05 18:10 by whw
    怎樣處理子程序的輸入?

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)  回復(fù)  更多評論   

    2009-05-30 09:50 by flyingpig204
    如果要知道執(zhí)行的程序運(yùn)行的時(shí)間和占用內(nèi)存該怎么做呢?

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)[未登錄]  回復(fù)  更多評論   

    2010-07-03 17:23 by panda
    @ddd
    有無數(shù)的這樣的需求,只要做過項(xiàng)目都知道。
    明明一個(gè)簡單的命令行,非得集成在項(xiàng)目里,給一個(gè)按鈕,還要顯示界面,
    還不做不行,這個(gè)就是TMD需求。

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)[未登錄]  回復(fù)  更多評論   

    2010-07-03 17:24 by panda
    還有感謝LZ分享。

    # re: Java調(diào)用外部進(jìn)程并攔截輸入輸出流--Java IDE Console解密(下篇)[未登錄]  回復(fù)  更多評論   

    2011-02-26 19:38 by 匿名
    表示十分的贊同
    主站蜘蛛池模板: 24小时日本在线www免费的| 亚洲videosbestsex日本| 精品久久免费视频| 99re在线免费视频| 中国黄色免费网站| 猫咪免费观看人成网站在线| 亚洲特级aaaaaa毛片| 久久精品国产精品亚洲艾草网| 亚洲色欲久久久久综合网| 免费黄色毛片视频| 国产v精品成人免费视频400条| 国产免费无码一区二区| 一级毛片不卡免费看老司机| 亚洲AV成人片无码网站| 亚洲一区二区三区高清不卡| 亚洲欧洲精品国产区| 亚洲一本综合久久| 亚洲国产精品国自产拍AV| 国产偷国产偷亚洲高清日韩| 国产免费观看青青草原网站| 国产精品视_精品国产免费| 好男人www免费高清视频在线| 在线视频免费观看爽爽爽| 69视频在线观看免费| 久久成人免费大片| 久久免费美女视频| 黄色免费在线网站| 国产免费一区二区三区在线观看| 免费人成在线观看视频高潮| 最近免费中文字幕中文高清| 中国国产高清免费av片| 青青操免费在线视频| 在线观看免费黄色网址| 久久精品国产免费一区| 99re6在线视频精品免费下载| 91人成网站色www免费下载| 免费福利在线播放| 欧美日韩国产免费一区二区三区 | 国产免费av片在线播放| 国产免费AV片无码永久免费| 亚洲av日韩av欧v在线天堂|