当我启动像process= Runtime.getRuntime().exec("gnome-terminal");这样的进程时,它开始执行外壳程序,我想停止执行外壳程序,并希望从进程中重定向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();

}

当我在文本字段中输入一些命令并按执行按钮时,我的输出文本区域上什么也没有显示,如何停止shellexecution并可以重定向输入和输出?

最佳答案

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如何执行。

关于java - 需要有关过程的帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2992801/

10-13 21:54