पर इनपुटस्ट्रीम पाइप कैसे करें कृपया दूसरे अपडेट पर जाएं। मैं इस प्रश्न के पिछले संदर्भ को बदलना नहीं चाहता था।प्रोसेस बिल्डर
मैं जावा ऐप से wkhtmltoimage का उपयोग कर रहा हूं।
इसका उपयोग करने का मानक तरीका है - path-to-exe http://url.com/ image.png
।
उनके दस्तावेज़ों के मुताबिक, यदि हम एक इनपुट यूआरएल के बजाय -
लिखते हैं, तो इनपुट एसटीडीआईएन में बदल जाता है।
मैं ProcessBuilder
का उपयोग कर प्रक्रिया शुरू करने से कर रहा हूँ -
ProcessBuilder pb = new ProcessBuilder(exe_path, " - ", image_save_path);
Process process = pb.start();
अब मैं यह पता लगाने में असमर्थ हूँ कि कैसे इस प्रक्रिया के लिए पाइप एक इनपुट स्ट्रीम करने के लिए।
मैं एक टेम्पलेट फ़ाइल एक DataInputStream
में पढ़ा है, और मुझे अंत में एक स्ट्रिंग जोड़कर हूँ: प्रक्रिया के STDIN
को
content
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>";
कैसे करूँ?
अद्यतन ---
Andrzej डॉयल द्वारा जवाब के बाद:
मैं का उपयोग किया है की प्रक्रिया के 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.
मैं क्या करने की जरूरत और क्या कर पाइप खोलने के लिए?
आप इस कार्यक्रम के अंत में pb.start कदम नहीं करना चाहिए? (bw.write (सामग्री) के बाद; "हम इसे शुरू करने के बाद किसी प्रक्रिया को कैसे लिखते हैं" पर आधारित एक हंच! – Sap
@Grrrrr मुझे लगता है कि हमें आउटपुटस्ट्रीम प्राप्त करने के लिए एक प्रक्रिया शुरू करने की आवश्यकता होगी। –
आप आउटपुटस्ट्रीम में डेटा लिख रहे हैं, यह अनुवाद करता है कि "आप प्रक्रिया में डेटा लिख रहे हैं!" यदि आप प्रक्रिया का आउटपुट प्राप्त करना चाहते हैं तो आपको प्रक्रिया करना चाहिए .getInputStream और फिर इसे – Sap