当读取命令时,循环不会退出

时间:2015-02-26 16:31:03

标签: java loops while-loop console command

使用while循环读取命令返回的文本时遇到问题。 我有以下代码:

class CommandExecuter {
  ProcessBuilder builder = null;
  Process p = null;
  BufferedWriter writer = null;
  String str = "";
  BufferedReader hey = null;
  StringBuffer buffer = null;

  CommandExecuter() {
  }

  public void run() {
    builder = new ProcessBuilder("/bin/bash");

    try {
      p = builder.start();
    }
    catch (IOException e) {
      e.printStackTrace();
    }

    writer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
    hey = new BufferedReader(new InputStreamReader(p.getInputStream()));
    buffer = new StringBuffer();
  }

  String exec(String command) {
    try {
      writer.write(command);
      writer.newLine();
      writer.flush();
      int a = 0;

      while ((str = hey.readLine()) != null) {
        a++;
        System.out.println(a);
        buffer = buffer.append(str + ":");
      }

      System.out.println("finished");
      return buffer.toString();
    }
    catch (Exception e) {
      e.printStackTrace();
    }
    return "1";
  }
}

问题是,当控制台完成打印文本时,while循环不起作用。它永远不会到达打印的部分"完成"。使用命令ls时,它返回一个8行长的String。变量" a"打印到8,然后停止,但循环不会退出,因为它永远不会到达成品部分。

1 个答案:

答案 0 :(得分:0)

您正在运行一个交互式shell,并通过标准输入来提供命令。一旦执行了命令,shell将打印其输出并继续运行,等待更多命令。因此,shell进程的标准输出将永远不会关闭。

您可能应该做的是将每个命令作为自己的新进程运行,可能以/bin/bash -c command的形式运行。