使用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,然后停止,但循环不会退出,因为它永远不会到达成品部分。
答案 0 :(得分:0)
您正在运行一个交互式shell,并通过标准输入来提供命令。一旦执行了命令,shell将打印其输出并继续运行,等待更多命令。因此,shell进程的标准输出将永远不会关闭。
您可能应该做的是将每个命令作为自己的新进程运行,可能以/bin/bash -c command
的形式运行。