需要有关流程的帮助

时间:2010-06-07 20:15:30

标签: java

当我开始像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上没有显示任何内容,我如何停止执行并可以重定向输入和输出?

1 个答案:

答案 0 :(得分: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如何操作。