मुझे लगता है कि समस्या यह है कि आप केवल इनपुटस्ट्रीम पढ़ रहे हैं और त्रुटि स्ट्रीम पढ़ रहे हैं। आपको यह भी ध्यान रखना होगा कि दोनों धाराएं समानांतर में पढ़ी जाती हैं। ऐसा हो सकता है कि वर्तमान में आउटपुट स्ट्रीम से पाइप डेटा ओएस बफर भरता है, आपके पाठक को बफर खाली करने का मौका देने के लिए आपके exec कमांड को स्वचालित रूप से निलंबित कर दिया जाएगा। लेकिन कार्यक्रम अभी भी आउटपुट की प्रक्रिया के लिए इंतजार कर रहा है। इसलिए, लटका होता है।
आप एक अलग वर्ग के रूप में निम्नानुसार दोनों इनपुट और त्रुटि स्ट्रीम को संभालने के लिए बना सकते हैं,
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();
}
}
}
जिस तरह से आप यह इस प्रकार है का उपयोग करें,
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();
}
[ProcessBuilder] (http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html) पर एक नज़र डालें। यह इस तरह की चीज करने के लिए एक आसान एपीआई है – RNJ
यदि कोई आउटपुट नहीं है, तो 'readLine' हमेशा के लिए अवरुद्ध होगा। – assylias
@assylias: कोई आउटपुट नहीं है तो मैं कैसे जांचूं? – user1688404