V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sandman511
V2EX  ›  程序员

求助: Java 调用 exe 后如何输入一些内容

  •  
  •   sandman511 · 2019-11-05 09:34:28 +08:00 · 1530 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个 exe 文件用于计算,打开后跟 cmd 类似,无法接受参数 打开后需要自定义输入 输出文件的文件名 后按回车才能开始运算(或者直接回车,用默认的文件名) 不知道调用 exe 后如何输入一些内容,以下是代码(无效)

            String[] cmd2 = {"D:\\xxx\\Stas.exe"};
            Process process = null;
            try {
                Runtime runtime = Runtime.getRuntime();
                process = runtime.exec(cmd2);
                InputStreamReader in=new InputStreamReader(process.getInputStream());
                BufferedReader inBr=new BufferedReader(in);
                String lineStr;
    
                OutputStreamWriter os = new OutputStreamWriter(process.getOutputStream());
                BufferedWriter bw = new BufferedWriter(os);
                bw.write("\n"); 
                bw.write("\n");
    
                while((lineStr=inBr.readLine())!=null){
                    System.out.println(lineStr);
                }
    
                //process.waitFor();
                process.getInputStream().close();
                process.getOutputStream().close();
                inBr.close();
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        
    
    4 条回复    2019-11-05 10:47:45 +08:00
    sandman511
        1
    sandman511  
    OP
       2019-11-05 09:37:37 +08:00
    而且有一点 调用记事本的时候 会直接弹出记事本,但是调用这个 exe 并没有弹出界面,但是任务管理器中,在 idea 的子进程中有 exe 这个进程
    xyjincan
        2
    xyjincan  
       2019-11-05 10:05:55 +08:00
    你要调用的进程还没跑出来,主程序就退出了,你需要开个线程等一会,得到需要的结果后再说


    boolean flag = true;
    while(flag) {
    if(!process.isAlive()) {
    flag = false;
    try {
    process.getInputStream().close();
    process.getOutputStream().close();
    inBr.close();
    in.close();

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    Thread.sleep(100);
    }
    vwym
        3
    vwym  
       2019-11-05 10:24:23 +08:00
    exe 本质上是一个壳,你调用记事本打开那是因为记事本做了图形化界面。调用对应 exe 没有界面那是别人没做。
    “打开后需要自定义输入 输出文件的文件名 后按回车才能开始运算(或者直接回车,用默认的文件名) 不知道调用 exe 后如何输入一些内容”
    推测别人做了信息提示,但是你用 readline()读取会导致主线程阻塞,获取提示信息后,没办法通过流把信息传递给 Stas.exe ,这里需要用到第二条线程,第一条线程专门处理 process 的 inputstream,第二条线程专门打印 process 的 outputstream。
    z888888cn
        4
    z888888cn  
       2019-11-05 10:47:45 +08:00
    输入输出流重定向。
    或者 test.exe << 输入的内容
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:46 · PVG 20:46 · LAX 04:46 · JFK 07:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.