【问题标题】:interacting with console app using java使用 java 与控制台应用程序交互
【发布时间】:2013-07-28 17:16:40
【问题描述】:

我想使用 java 打开一个外部应用程序。

    Process p = Runtime.getRuntime().exec("/Users/kausar/myApp");

这会运行我在活动监视器中看到的过程。 现在我运行的文件实际上是控制台应用程序,它接收命令并根据这些命令给出响应。 例如,如果我去终端并输入相同的内容

    Kausars-MacBook-Air:~ kausar$ /Users/kausar/myApp
    myApp>

现在我可以向应用程序发出命令,例如

    myApp> SHOW 'Hi There'

这些是在控制台应用程序中作为键盘输入的命令,它们不是参数。我已经看到了不同的参数方法。我也尝试了以下方法,但无法正常工作。

     String res;        
     String cmnd = "SHOW \'Hi There\'";
     OutputStream stdin = null;
    InputStream stdout = null;
    stdout = p.getInputStream();
    stdin = p.getOutputStream();

    stdin.write(cmnd.getBytes());
    stdin.flush();
    p.waitFor();

    BufferedReader input = new BufferedReader(
              new InputStreamReader(stdout));
          while ((res = input.readLine()) != null) {
            System.out.println(res)
          }
          input.close();

    p.destroy();

它什么也不显示,而使用“/bin/bash -c ls”的相同程序可以正常工作。 请帮忙!

【问题讨论】:

  • 您将 stderr 定义为输入流并将 p.getInptStream 分配给 stdout。
  • @Guanxi 已更正,可能是复制粘贴错误,谢谢指出

标签: java macos console command


【解决方案1】:

我会说问题出在 p.*wait*For() 究竟什么对象以及何时使用 notify() 或 notifyAll() 调用来唤醒对象线程将类似于 stdout 上的内容,并且可能是进程的重组。 注意:一个有趣的特性是 BufferedReader 中名为“lock”的类字段,api 文档确实提到了一些结构化程序的方法,以便通知它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2011-09-05
    • 2012-04-08
    • 2013-03-29
    相关资源
    最近更新 更多