Frage

ich mit ImageMagick arbeite und frage mich, was der beste Weg, Bilddaten in von StdOut des ImageMagick Prozess zu lesen.

ich eine Berufung auf den Befehl für den Prozess wie folgt: / Opt / local / bin / convert -resize 8000 @ - -

und dann kochend einen Byte-Array zu dem Prozess für die Verarbeitung.

Was ist der beste Weg, um Daten von einem Prozess, wie diese zu lesen?

War es hilfreich?

Lösung

Sie können unter Apache Commons Exec aussehen wollen diese Ihnen einen guten Weg gibt die laufenden ausführbare Dateien und Weitergabe der Ergebnisse in Java.

Es ist ähnlich der Methode Michael erwähnt mit Ausnahme sollten Sie mehr Kontrolle ermöglichen.

Es gibt einige gute Beispiele für den Einsatz auf der Tutorial Seite.

Andere Tipps

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

    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);
        }

    }

Die Methode gibt einen Runtime.exec() Process die Methoden, um die Eingabe, Ausgabe und Fehlerströme des aufgerufenen Prozesses hat.

ich frage mich, wie Sie es geschafft, „Rohr ein Byte-Array an den Prozess“ in irgendeiner anderen Art und Weise.

Beachten Sie, dass Sie mehrere Threads verwenden, um den Eingang und den Ausgang des erzeugten Prozess zu behandeln, weil es blockiert, wenn Sie versuchen, „Rohr in“ viel Eingang ohne jegliche Ausgabe zu lesen.

Wenn Sie Runtime.exec () verwenden wollen, lesen Sie bitte diese Frage als Runtime.exec () kann ein bisschen schwierig sein.

Sie werden wollen, die StreamGobbler für OUTPUT in etwas zu ändern, die in einem Array oder so stdout speichern. Und die Fäden beginnen, bevor waitFor tun () zu verhindern, wie Michael sagte, blockiert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top