2番目の更新に移動してください。私はこの質問の前の文脈を変えたくありませんでした。InputStreamをProcessBuilderにパイプする方法
私はJavaアプリケーションからwkhtmltoimageを使用しています。
標準的な使用方法は、 - 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>";
どのようにプロセスのSTDIN
にIパイプcontent
していますか?
私が使用したプロセスのgetOutputStream()
:アンジェイ・ドイルによって解答後
UPDATE ---
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
第二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.
を与えますパイプを開いたままにしますか?
(ピーターが示唆されているように、実際のプロセスの出力を見ては、おそらく...ので、あなたに言っただろうか)? (bw.write(content)の後;「開始した後にプロセスにどのように書き込むのですか」に基づいてちょうど勘弁してください) – Sap
@Grrrrよく、私たちは出力ストリームを取得するためにプロセスを開始する必要があると思います。 –
あなたは出力ストリームにデータを書き込んでいます。これは「あなたはプロセスにデータを書き込んでいます!」と解釈します。プロセスの出力を取得するにはprocess.getInputStreamを実行してからそれを読み取る必要があります – Sap