2009-03-07 2 views

Antwort

2

Sie könnten Apache Commons Exec aussehen wollen dieses gibt Ihnen eine gute Möglichkeit, ausführbare Dateien laufen und vorbei die Ergebnisse in Java.

Es ist ähnlich wie bei der Verwendung der Methode Michael erwähnt, außer sollten Sie mehr Kontrolle zu ermöglichen.

Es gibt einige gute Beispiele für die Verwendung auf der tutorial Seite.

+0

Dank waren meine Probleme meist zwischen dem Stuhl und Tastatur und wegen Hacking viel zu spät in der Nacht. Ihr Tipp für Apache Exec hat sich jedoch gelohnt und die Qualität der Lösung verbessert. –

1

Die Methode Runtime.exec() gibt eine Process zurück, die über Methoden zum Abrufen der Eingabe-, Ausgabe- und Fehlerströme des aufgerufenen Prozesses verfügt.

Ich frage mich, wie Sie es geschafft haben, "eine Byte-Array auf den Prozess" in irgendeiner anderen Weise zu leiten.

Beachten Sie, dass Sie mehrere Threads verwenden müssen, um die Eingabe und die Ausgabe des erzeugten Prozesses zu verarbeiten, da es blockiert, wenn Sie versuchen, viele Eingaben "einzupfeifen", ohne eine Ausgabe zu lesen.

1

Wenn Sie Runtime.exec() verwenden möchten, überprüfen Sie bitte this question als runtime.exec() kann ein bisschen schwierig sein.

Sie werden wollen, die StreamGobbler für OUTPUT in etwas zu ändern, die Geschäfte in einem Array stdout oder so. Und starte die Threads, bevor du waitFor() machst, um zu verhindern, wie Michael sagte, zu blockieren.

2

Ich will nur der Vollständigkeit halber ein Codebeispiel mit ImageMagick über Apache commons exec schreiben

try { 

     StringBuffer sb = new StringBuffer(); 
     sb.append(this.validPathToImageMagickCommand); 
     sb.append('\u0020'); 
     for (int i = 0; i < args.size(); i++) { 
      String s = args.get(i); 
      sb.append(s); 
     } 


     CommandLine cl = CommandLine.parse(sb.toString()); 

     PumpStreamHandler pumpStreamHandler = new PumpStreamHandler(output, System.err, new ByteArrayInputStream(inputBytes)); 
     byAs = new ByteArrayInputStream(inputBytes); 
     pumpStreamHandler.setProcessOutputStream(byAs); 

     DefaultExecutor executor = new DefaultExecutor(); 
     executor.setStreamHandler(pumpStreamHandler); 
     int exitValue = executor.execute(cl); 

     outputBytes = output.toByteArray(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      if (byAs != null) 
       byAs.close(); 

      if (output != null) 
       output.close(); 

     } catch (IOException e) { 
      System.out.println(e); 
     } 

    } 
Verwandte Themen