我在d:\hello下有一个dos程序hello.exe,并把该路径加入path
调用Runtime.getRuntime().exec("hello.exe");为什么看不到我的程序执行,但是在task manager中看到有cmd.exe 在运行,因为我执行了多次,所以看到有好几个,而且我试着exec("sqlplus")也不行,但是sqlplus进程也启动了,就是没有弹出窗口让我登陆,但是exec("notepad")就可以,好像是执行图形类的程序就可以,很奇怪的一个问题啊,各位高手帮忙啊,因为我要在java下调用别人做的c程序,不是很方便用jni来实现。

解决方案 »

  1.   

    如果是Windows的path里面的可执行程序可以直接用名字,如果不是需要这么来来处理Runtime.getRuntime().exec("cmd /c hello.exe");
      

  2.   

    还有就是其实由的程序已经执行了,但是执行之后是由一些信息打印在cmd里面的
    这些我们是看不到的
    需要我们用OutputSream来捕获输出Process p=Runtime.getRuntime().exec("hello.exe");
    p.getOutputStream()
      

  3.   

    借宝地问一下相关问题
    我exec("QQ.EXE");  执行了以后 可以看到QQ  但是怎么在JAVA程序里面输入ID  PASSWORD
    而不用再手工输入
      

  4.   

    用getOutputStream()捕获,进程有的话说明已经启动了
      

  5.   

    回复人: haisenmai(我应该做得到) ( ) 信誉:100  2005-05-20 22:16:00  得分: 0  
     
     
       借宝地问一下相关问题
    我exec("QQ.EXE");  执行了以后 可以看到QQ  但是怎么在JAVA程序里面输入ID  PASSWORD
    而不用再手工输入
      
     
    晕死,获得焦点,哈哈,不要用java做这种事,你会郁闷死的
    除非QQ.exe提供参数
      

  6.   

    那象Sqlplus是需要输入用户名密码登陆的呀,dos窗口就是出不来的吗?那我怎么通过那个程序做输入呀?
      

  7.   

    经过再次测试,发现如果我的dos程序不要求输入的话就可以顺利执行完毕,但是如果要求输入的话那个进程就挂在那边了,这是怎么回事呢?
      

  8.   

    补充一下,这个提问的背景是我需要在java里调用别人实现的c程序,由于他们对dll不熟悉,所以不能用JNI的方法来实现,他们提供的可能就是一个普通c程序,那我调用它的时候弹不出输入窗口怎么办呢?那个进程就死在那边了呀?
      

  9.   

    用一楼的方法,cmd/c +路径+执行程序
    一直都这么用,注意路径中不能有空格存在,否则启动不了
      

  10.   

    另外一个进程和java主进程通过标准输入输出流进行通信
    注意:
         这时另外一个进程的System.in和System.out不是键盘和显示器,而是和java主进程进行通信的那个标注输入输出流 ,原理和两个线程间的管道流一样的
      

  11.   

    调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息. 由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(), Process.getErrorStream()方法重定向给它的父进程了.用户需要用这些stream来向 子进程输入数据或获取子进程的输出. 所以正确执行Runtime.exec("ls")的例程如下: 
    try
    {
    process = Runtime.getRuntime().exec (command);
    InputStreamReader ir=newInputStreamReader(process.getInputStream());
    LineNumberReader input = new LineNumberReader (ir);
    String line;
    while ((line = input.readLine ()) != null)
    System.out.println(line);
    }
    catch (java.io.IOException e){
    System.err.println ("IOException " + e.getMessage());

    /////////////////////////////////////////////////////////////////////////////////////
    Runtime.exec(“文本“)文本的内容必须在DOS或平台上可执行,如Runtime.exec(”move c:\\a.txt c:\\b\\”)就肯定执行不了,所以只能用拆衷的办法,把move c:\a.txt c:\b\写在一个批处理文件T内,然后执行:Runtime.exec(”t.bat:”)
      

  12.   

    使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序.
    该方法有6个可访问版本:
    1.exec(String command)
    2.exec(String command, String envp[], File dir) 
    3.exec(String cmd, String envp[])
    4.exec(String cmdarray[])
    5.exec(String cmdarray[], String envp[])
    6.exec(String cmdarray[], String envp[], File dir)一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本.
    其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本.
    当要执行批处理的时候,不能直接传递批处理的文件名,而要使用:
    cmd.exe /C start 批处理文件名
    使用dos命令(比如dir)时也要使用掉调用.如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream(),getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能.
    例子如下:
    package com.broadcontact.netadmin.schedule;
    import java.io.PrintWriter;
    import java.io.PrintStream;
    import java.io.IOException;
    import java.sql.SQLException;
    import java.util.Date;
    import java.io.StringReader;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.io.File;
    import java.io.BufferedWriter;
    import java.io.OutputStreamWriter;
    /**
     * <p>Title: netadmin</p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2002</p>
     * <p>Company: nm group</p>
     * @author Maico(Panghf)
     * @version 1.0
     */
    public class ExecuteTask implements Runnable {
      private boolean isRunning=true;
      public ExecuteTask() {
      }
      public void run(){
      }
      public static void main(String[] args){
        try {
     Process proc=Runtime.getRuntime().exec("cmd.exe");
            BufferedReader read=new BufferedReader(new InputStreamReader(proc.getInputStream()));
          new Thread(new Echo(read)).start();
          PrintWriter out=new PrintWriter(new OutputStreamWriter(proc.getOutputStream()));
          BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
          String instr = in.readLine();
          while(!"exit".equals(instr)){
            instr = in.readLine();
            out.println(instr);
            file://out.println("telnet 192.168.0.1");
            out.flush();
          }
          in.readLine();
          read.close();
          out.close();
        }
        catch (IOException ex) {
          ex.printStackTrace();
        }
      }
    }
    class Echo implements Runnable {
      private BufferedReader read;
      public Echo(BufferedReader read){
        this.read = read;
      }
      public void run() {
        try {
          String l = read.readLine();
          while (l != null) {
            System.out.println(l);
            l = read.readLine();
          }
          System.out.println("---执行完毕:");
        }
        catch (IOException ex) {
          ex.printStackTrace();
        }
      }
    }
      

  13.   

    不过我想如果输入比较简单的话,我可以要求他们把输入通过c的main函数获得,那样我就只要exec("hello.exe param1 param2...)就可以了,main返回的结果我可以通过xml获取,这样可以的吗?