2016-08-09 27 views
0

Im folgenden Code verwendet der Autor Runtime, um einen Unterprozess aufzurufen. Aber ich verstehe nicht, warum er StreamGobbler verwendet. Was passiert, wenn es durch InputStream ersetzt wird? Bitte hilf mir, danke!Was ist der Unterschied zwischen InputStream und StreamGobbler?

public class GoodWindowsExec 
{ 
    public static void main(String args[]) 
    { 

     try 
     {    
      String osName = System.getProperty("os.name"); 
      System.out.println("osName: " + osName); 
      String[] cmd = new String[3]; 

      if(osName.equals("Windows XP") ||osName.equals("Windows 2000")) 
      { 
       cmd[0] = "cmd.exe" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 
      else if(osName.equals("Windows 98")) 
      { 
       cmd[0] = "command.com" ; 
       cmd[1] = "/C" ; 
       cmd[2] = args[0]; 
      } 

      Runtime rt = Runtime.getRuntime(); 
      System.out.println("Execing " + cmd[0] + " " + cmd[1]+ " " + cmd[2]); 
      Process proc = rt.exec(cmd); 
      // any error message? 
      StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR"); //Can I replace StreamGobbler by InputStream?   
      // any output? 
      StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT"); //As above 

      // kick them off 
      errorGobbler.start(); 
      outputGobbler.start(); 

      // any error??? 
      int exitVal = proc.waitFor(); 
      System.out.println("ExitValue: " + exitVal); 

     } catch (Throwable t){ 
      t.printStackTrace(); 
     } 
    } 
} 

BufferedReader brNormal = new BufferedReader(new InputStreamReader(process.getInputStream())); 
String s = null; 
while ((s = brNormal.readLine()) != null) { 
    logger.info("RawToRgbConverter.exe", s); 
} 
brNormal.close(); 
BufferedReader brError = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while ((s = brError.readLine()) != null) { 
    logger.error("RawToRgbConverter.exe", s); 
} 
brError.close(); 
+0

Aus welcher 3rd-Party-Bibliothek kommt 'StreamGobbler'? Aus dem Code scheint es, dass es einen Thread enthält, der den Stream liest, wahrscheinlich in einen Puffer im Speicher. Ein 'InputStream' würde nicht dasselbe tun. –

+0

Ich füge meinen eigenen Code in die Frage ein, in der ich InputStream benutze. Ich habe darin nichts falsches gefunden. Schätzen Sie Ihre Korrektur. – Niubility

Antwort

0

Schon als ich die StreamGobbler Klasse nicht wissen, ist dies offensichtlich eine Gewinde Implementierung der Ausgabe und Fehlerströme zu einem bestimmten Ziel zu kopieren. Also, nein, Sie können es nicht einfach ersetzen, da das Multithreading tatsächlich notwendig ist. Ein einfacher Eingabestrom würde einfach da sitzen, aber nichts tun.

Beachten Sie jedoch, dass diese Komplettlösung seit Java 1.5, die den ProcessBuilder und die automatischen Weiterleitungen eingeführt hat, veraltet ist. Siehe die Javadoc bei https://docs.oracle.com/javase/8/docs/api/

+0

Danke für Ihre Antwort. Ich füge meinen eigenen Code in die obige Frage ein, in der ich InputStream benutze. Ich habe darin nichts falsches gefunden. Schätzen Sie Ihre Korrektur. – Niubility

+0

Sie müssen tatsächlich verschiedene Threads starten, da sich das Lesen der Streams gegenseitig blockieren kann. Werfen Sie einen Blick auf die akzeptierte Antwort http://stackoverflow.com/questions/33418502/java-process-with-concurrent-input-output-streams für ein Beispiel mit Threads. – mtj