Wie Pipeline InputStream zu ProcessBuilder

8

Bitte gehen Sie zum 2. Update. Ich wollte den vorherigen Kontext dieser Frage nicht ändern.

Ich verwende wkhtmltoimage von einer Java-App.

Die Standardmethode dafür ist - path-to-exe http://url.com/ image.png .

Wenn wir gemäß ihrer Dokumentation eine - anstelle einer Eingabe-URL schreiben, wechselt die Eingabe zu STDIN.

Ich beginne den Prozess mit ProcessBuilder -

%Vor%

Jetzt kann ich nicht herausfinden, wie man einen Eingabestream zu diesem Prozess leitet.

Ich habe eine Vorlagendatei in ein DataInputStream eingelesen und füge am Ende eine Zeichenfolge an:

%Vor%

Wie übergebe ich content an die STDIN des Prozesses?

UPDATE ---

Nach der Antwort von Andrzej Doyle:

Ich habe die getOutputStream() des Prozesses verwendet:

%Vor%

Dies führt zu einem Fehler, der besagt:

%Vor%

2. UPDATE --------

Der aktuelle Codeblock ist so:

%Vor%

Das Ausführen des obigen Codes gibt mir IOException: The pipe is being closed.

Was muss ich noch tun, um das Rohr offen zu halten?

    
Hrishikesh Choudhari 28.06.2012, 09:34
quelle

5 Antworten

3

Entfernen Sie das Leerzeichen aus " - " - die normalen Leerzeichen werden vom Shell-Parser entfernt, aber hier in ProcessBuilder wird es als (literaler) Dateiname interpretiert, der mit einem Leerzeichen beginnt und endet.

(Wenn man sich die Ausgabe des Prozesses anschaut, wie es Peter vorgeschlagen hat, hätte er das wahrscheinlich schon gesagt ...)

    
ShiDoiSi 10.08.2012, 11:38
quelle
6
  

Ausnahme im Thread "main" java.io.IOException: Die Pipe wurde beendet

Dies bedeutet, dass der Prozess, den Sie begonnen haben, gestorben ist. Ich schlage vor, Sie lesen die Ausgabe, um zu sehen, warum. z.B. Hat es dir einen Fehler gegeben?

    
Peter Lawrey 07.08.2012 13:38
quelle
5

Gibt es einen Grund, warum Sie DataInputStream zum Lesen einer einfachen Textdatei verwenden? Aus der Java-Dokumentation

  

Ein Dateneingangsstrom ermöglicht einer Anwendung, primitive Java-Datentypen zu lesen   von einem zugrunde liegenden Eingabestrom auf eine maschinenunabhängige Art und Weise

Es ist möglich, dass die Art, wie Sie die Datei lesen, dazu führt, dass ein EOF an den Ausgabestrom gesendet wird, was dazu führt, dass die Pipe endet, bevor sie an Ihre Zeichenfolge gelangt.

Ihre Anforderung scheint zu sein, die Datei einfach zu lesen, um sie anzuhängen, bevor Sie sie an den Prozess wkhtmltoimage weiterleitet.

Sie verpassen auch eine Anweisung, um den Ausgabestream für den Prozess zu schließen. Dies führt dazu, dass der Prozess wartet (hängt), bis er einen EOF aus dem Eingabestream erhält, was niemals der Fall sein würde.

Ich würde empfehlen, stattdessen einen BufferedReader zu verwenden und ihn direkt in den Ausgabestrom zu schreiben, bevor Sie Ihre zusätzliche Zeichenfolge anhängen. Rufen Sie dann close () auf, um den Stream zu schließen.

%Vor%     
Rajesh J Advani 06.08.2012 09:04
quelle
3

Nachdem Sie das Objekt Process erstellt haben, können Sie getOutputStream() , um einen Stream zu erhalten, der seinen Inhalt an die Standardeingabe des Prozesses sendet.

Sobald Sie sich daran gewöhnt haben, können Sie die Standard-IO von Java verwenden, um alle Bytes in den gewünschten Stream zu schreiben (einschließlich des Einschließens in einen Writer, Hinzufügen von Pufferung usw.) - und während Sie sie schreiben, werden sie es sein gelesen von dem Prozess, sobald sie gespült sind.

    
Andrzej Doyle 28.06.2012 09:51
quelle
1

Der folgende Code funktioniert auch:

%Vor%

Hier ist stdinecho.cpp das Programm, das die Zeile ausgibt, die an der Eingabeaufforderung eingegeben wurde:

%Vor%     
Xolve 10.08.2012 09:50
quelle