Tôi đoán vấn đề là bạn chỉ đọc InputStream và không đọc ErrorStream. Bạn cũng phải cẩn thận rằng cả hai luồng được đọc song song. Nó có thể xảy ra như vậy hiện tại các dữ liệu đường ống từ dòng đầu ra đầy lên bộ đệm hệ điều hành, lệnh exec của bạn sẽ được tự động bị đình chỉ để cung cấp cho người đọc của bạn một cơ hội để làm trống bộ đệm. Nhưng chương trình vẫn sẽ chờ đợi cho đầu ra để xử lý. Do đó, hang xảy ra.
Bạn có thể tạo ra một lớp riêng biệt để xử lý cả đầu vào và Lỗi Suối như sau,
public class ReadStream implements Runnable {
String name;
InputStream is;
Thread thread;
public ReadStream(String name, InputStream is) {
this.name = name;
this.is = is;
}
public void start() {
thread = new Thread (this);
thread.start();
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader (is);
BufferedReader br = new BufferedReader (isr);
while (true) {
String s = br.readLine();
if (s == null) break;
System.out.println ("[" + name + "] " + s);
}
is.close();
} catch (Exception ex) {
System.out.println ("Problem reading stream " + name + "... :" + ex);
ex.printStackTrace();
}
}
}
Cách bạn sử dụng nó như sau,
String cmd= "cmd /C si viewhistory --fields=revision --project="+fileName;
Process p = Runtime.getRuntime().exec(cmd) ;
s1 = new ReadStream("stdin", p.getInputStream());
s2 = new ReadStream("stderr", p.getErrorStream());
s1.start();
s2.start();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(p != null)
p.destroy();
}
Hãy xem [ProcessBuilder] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html). Đây là một API đơn giản hơn để thực hiện loại điều này – RNJ
Nếu không có đầu ra, 'readLine' sẽ chặn mãi mãi. – assylias
@assylias: làm thế nào để tôi kiểm tra nếu không có đầu ra? – user1688404