Пожалуйста, перейдите к второму обновлению. Я не хотел менять предыдущий контекст этого вопроса.Как подключить InputStream к ProcessBuilder
Я использую wkhtmltoimage из приложения Java.
Стандартный способ использования - path-to-exe http://url.com/ image.png
.
В соответствии с их документами, если мы напишем -
вместо входного URL-адреса, вход переходит к STDIN.
Я начинаю процесс с помощью ProcessBuilder
-
ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);
Process process = pb.start();
Теперь я не могу понять, как труба входного потока в этом процессе.
У меня есть файл шаблона для чтения в DataInputStream
, и я присоединяя строку в конце:
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>";
Как я труба content
к STDIN
процесса?
UPDATE ---
После ответа Анджея Дойла:
Я использовал getOutputStream()
процесса:
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);
Doing так выдает ошибку, говоря:
Exception in thread "main" java.io.IOException: The pipe has been ended
второй UPDATE --------
текущий код блока как такового:
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();
}
Запуск выше код дает мне IOException: The pipe is being closed.
Что еще мне нужно сделать чтобы труба открылась?
Если вы не двигаться pb.start в конце программы? (после bw.write (content). Просто догадка, основанная на «как мы пишем процесс после того, как это началось!» – Sap
@Grrrrr. Думаю, нам нужно будет начать процесс, чтобы получить его выходной поток. –
Вы записываете данные в выходной поток, это означает, что «вы записываете данные в процесс!». Если вы хотите получить результат процесса, тогда вы должны сделать process.getInputStream, а затем прочитать его. – Sap