Перейдите ко второму обновлению. Я не хотел менять предыдущий контекст этого вопроса.
Я использую 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
процесса?
ОБНОВЛЕНИЕ---
После ответа Анджея Дойла:
Я использовал 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);
При этом появляется сообщение об ошибке:
Exception in thread "main" java.io.IOException: The pipe has been ended
2-е ОБНОВЛЕНИЕ--------
Текущий блок кода выглядит так:
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.
Что еще мне нужно сделать, чтобы оставить трубу открытой?
getOutputStream
очень неясным именем для фактической цели: Возвращает выходной поток, подключенный к обычному входу подпроцесса. Вывод в поток направляется на стандартный ввод процесса, представленного этим объектом Process. В python он просто называетсяstdin
, но тогда можно утверждать, что запись в нечто с именемstdin
семантически некорректна. - person Aurélien Ooms   schedule 02.09.2014