Zgadnij, problem polega na tym, że czytasz tylko InputStream i nie czyta ErrorStream. Musisz także uważać, aby oba strumienie były odczytywane równolegle. Może się zdarzyć, że obecnie dane przesyłane ze strumienia wyjściowego wypełniają bufor systemu operacyjnego, polecenie exec zostanie automatycznie zawieszone, aby dać czytelnikowi szansę na opróżnienie bufora. Ale program nadal będzie czekał na przetworzenie wyjścia. W związku z tym zawiesza się.
Można utworzyć oddzielną klasę do obsługi zarówno wejście i błędów Stream następująco,
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();
}
}
}
Sposób korzystania jest następująca,
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();
}
Zobacz [ProcessBuilder] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html). To jest prostsze API do robienia tego rodzaju rzeczy. – RNJ
Jeśli nie ma wyjścia, 'readLine' będzie blokować na zawsze. – assylias
@assylias: jak sprawdzić, czy nie ma wyjścia? – user1688404