Passare al secondo aggiornamento. Non volevo cambiare il contesto precedente di questa domanda.Come inviare InputStream a ProcessBuilder
Sto usando wkhtmltoimage da un'app Java.
Il modo standard di utilizzo è - path-to-exe http://url.com/ image.png
.
Secondo i loro documenti, se scriviamo un -
anziché un URL di input, l'input si sposta su STDIN.
sto iniziando il processo utilizzando ProcessBuilder
-
ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);
Process process = pb.start();
Ora sono in grado di capire come tubo di un flusso di input a questo processo.
Ho un file di modello di leggere in un DataInputStream
, e sto aggiungendo una stringa alla fine:
DataInputStream dis = new DataInputStream (new FileInputStream (currentDirectory+"\\bin\\template.txt"));
byte[] datainBytes = new byte[dis.available()];
dis.readFully(datainBytes);
dis.close();
String content = new String(datainBytes, 0, datainBytes.length);
content+=" <body><div id='chartContainer'><small>Loading chart...</small></div></body></html>";
Come faccio a tubo content
al STDIN
del processo?
UPDATE ---
In seguito alla risposta da Andrzej Doyle:
Ho usato il getOutputStream()
del processo:
ProcessBuilder pb = new ProcessBuilder(full_path, " - ", image_save_path);
pb.redirectErrorStream(true);
Process process = pb.start();
System.out.println("reading");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bw.write(content);
In questo modo dà un errore che dice:
Exception in thread "main" java.io.IOException: The pipe has been ended
2 ° AGGIORNAMENTO --------
Il blocco di codice corrente è in quanto tale:
try {
ProcessBuilder pb = new ProcessBuilder(full_path, "--crop-w", width, "--crop-h", height, " - ", image_save_path);
System.out.print(full_path+ "--crop-w"+ width+ "--crop-h"+ height+" "+ currentDirectory+"temp.html "+ image_save_path + " ");
pb.redirectErrorStream(true);
Process process = pb.start();
process.waitFor();
OutputStream stdin = process.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
// content is the string that I want to write to the process.
writer.write(content);
writer.newLine();
writer.flush();
writer.close();
} catch (Exception e) {
System.out.println("Exception: " + e);
e.printStackTrace();
}
L'esecuzione del codice di cui sopra mi dà un IOException: The pipe is being closed.
Cos'altro devo fare tenere la pipa aperta?
non si dovrebbe muovere pb.start alla fine del programma? (dopo bw.write (contenuto); Solo un sospetto basato su "come scrivere su un processo dopo che è stato avviato!" – Sap
@Grrrrr beh, penso che avremmo bisogno di avviare un processo per ottenere il suo outputstream. –
Stai scrivendo i dati nell'output che si traduce in "stai scrivendo dati nel processo!" Se vuoi ottenere l'output del processo, dovresti fare process.getInputStream e poi leggerlo – Sap