2010-06-07 121 views
3

當我開始像process= Runtime.getRuntime().exec("gnome-terminal");這樣的進程時,它開始執行shell,我想停止shell執行並想從進程中重定向I/O,任何人都可以告訴我該怎麼做?需要關於進程的幫助

我的代碼是:

public void start_process() 
{ 
    try 
    { 
     process= Runtime.getRuntime().exec("bash"); 
     pw= new PrintWriter(process.getOutputStream(),true); 
     br=new BufferedReader(new InputStreamReader(process.getInputStream())); 
     err=new BufferedReader(new InputStreamReader(process.getErrorStream())); 

    } 
    catch (Exception ioe) 
    { 
     System.out.println("IO Exception-> " + ioe); 
    } 


} 

public void execution_command() 
{ 

    if(check==2) 
    { 
     try 
     { 
      boolean flag=thread.isAlive(); 
      if(flag==true) 
       thread.stop(); 

      Thread.sleep(30); 
      thread = new MyReader(br,tbOutput,err,check); 
      thread.start(); 

     }catch(Exception ex){ 
      JOptionPane.showMessageDialog(null, ex.getMessage()+"1"); 
     } 
    } 
    else 
    { 
     try 
     { 
      Thread.sleep(30); 
      thread = new MyReader(br,tbOutput,err,check); 
      thread.start(); 
      check=2; 

     }catch(Exception ex){ 
      JOptionPane.showMessageDialog(null, ex.getMessage()+"1"); 
     } 

    } 
} 

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 
    command=tfCmd.getText().toString().trim(); 

    pw.println(command); 

    execution_command(); 

}  

當我在文本框輸入一些命令,並按下執行鍵,沒事就我的輸出textarea的顯示,我怎麼能阻止shellexecution並且可以重定向輸入和輸出?

回答

3

Javadoc

ProcessBuilder.start()Runtime.exec()方法創建本機過程並返回的Process一個子類,可用來控制該過程,並獲得關於它的信息的一個實例。類Process提供了執行進程輸入,執行輸出到進程,等待進程完成,檢查進程的退出狀態以及銷燬(終止)進程的方法。

創建進程的方法可能不適用於某些本機平臺上的特殊進程,例如本機窗口進程,守護進程進程,Microsoft Windows上的Win16/DOS進程或shell腳本。創建的子流程沒有自己的終端或控制檯。其所有標準io(即stdin,stdout,stderr)操作將通過三個流(getOutputStream(),getInputStream(),getErrorStream())重定向到父進程。父進程使用這些流將輸入提供給子進程並從子進程獲取輸出。由於某些本地平臺僅爲標準輸入和輸出流提供有限的緩衝區大小,因此無法及時寫入輸入流或讀取子流程的輸出流可能會導致子流程阻塞甚至死鎖。

換句話說,將緩衝流讀取器連接到process.getInputStream()後,您應該讀取所​​有輸出以使其正常運行。

更新:here is a simple example如何做到這一點。