2010-06-07 124 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如何做到这一点。