public class RunCmd {
public RunCmd(String cmd) {
Runtime runtime = Runtime.getRuntime();
StringBuffer sb = new StringBuffer();
try {
final Process p = runtime.exec(cmd);
InputStream is = p.getInputStream();
InputStream err = p.getInputStream();
new Thread(new Runnable() {
public void run() {
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()),5000);
String a = "";
while (( a = in.readLine()) != null) {
try{Thread.sleep(50);} catch(InterruptedException ie) {System.out.println(ie);}
}
in.close();
}
catch (IOException ioe) {System.out.println(ioe);}
}
}).start();
new Thread(new Runnable() {
public void run() {
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getErrorStream()),5000);
String a = "";
while (( a = in.readLine()) != null) {
//System.out.println("read: " + a);
StatusTxt.append(a+"\\n");
try{Thread.sleep(50);}catch(InterruptedException ie) {System.out.println(ie);}
}
in.close();
}
catch (IOException ioe) {System.out.println(ioe);}
}
}).start();
}
catch (IOException ioee) {System.out.println(ioee);}
}
}
Det er ikke nødvendigt, at oprette 2 nye tråde til at læse outputtet fra din nye process. Grunden til, at dit oprindelige program ikke fik fat på processens feedback skyldtes sandsynligvis, at dit program enten når forbi dit while ((line = in.readLine()) != null) statement inden den nye process når at returnere noget feedback (kan skyldtes maskinens schedulerings strategi) eller også lyttede du på den forkerte strøm (InputStream vs. ErrorStream).
Derfor kan du enten indbygge en forsinkelse, i stil med den ovenstående via. Thread.sleep(x), i dit program så processen når at producere feedback. Tilsvarende skal man også sikre sig, at feedback strømmen ikke når at løbe tør informationer før processen rent faktisk er slut.
Du kan også bruge BufferedReader klassen til at opsamle alt feedback fra processen (i stil med ovenstående) og så bede dit program om at vente indtil processen afsluttes via. <Process>.waitFor().
Men eftersom JVM allerede afvikler koden i main metoden i en tråd er der ingen grund til at oprette 2 nye. Tommelfingerreglen for multithreading er, at medmindre du har en rigtig god grund til at oprette en ny tråd så lad være :o)
Der er sikkert en pænere måde at gøre det på, men mon ikke nedenstående fungerer?
(Det er ikke testet)
public class RunCmd {
public RunCmd(String cmd) {
String input;
Runtime runtime = Runtime.getRuntime();
try {
Process p = runtime.exec(cmd);
InputStream is = p.getInputStream();
InputStream err = p.getInputStream();
BufferedReader stdin = new BufferedReader(is,5000);
BufferedReader stderror = new BufferedReader(err,5000);
//wait until Process p exits
p.waitFor();
while((input = stdin.readLine()) != null){
System.out.println("stdin > " + input);
}
while((input = stderror.readLine()) != null){
System.out.println("stderror > " + input);
}
//Free ressources
stdin.close();
stderror.close();
}
catch (Exception e) { e.printStackTrace(); }
}
}