मैं जावा में ProcessBuilder का उपयोग करके एक प्रक्रिया का निर्माण कर रहा हूं:
ProcessBuilder pb = new ProcessBuilder()
.command("somecommand", "arg1", "arg2")
.redirectErrorStream(true);
Process p = pb.start();
InputStream stdOut = p.getInputStream();
अब मेरी समस्या निम्नलिखित है: मैं उस प्रक्रिया के stdout और / या stderr के माध्यम से जो कुछ भी हो रहा है उस पर कब्जा करना चाहूंगा और इसे System.out
अतुल्यकालिक रूप से पुनर्निर्देशित करूंगा । मैं पृष्ठभूमि में चलने के लिए प्रक्रिया और इसके आउटपुट पुनर्निर्देशन चाहता हूं। अब तक, मुझे ऐसा करने का एकमात्र तरीका मैन्युअल रूप से एक नया धागा स्पॉन करना है जो कि लगातार पढ़ा जाएगा stdOut
और फिर उपयुक्त write()
विधि को कॉल करेगा System.out
।
new Thread(new Runnable(){
public void run(){
byte[] buffer = new byte[8192];
int len = -1;
while((len = stdOut.read(buffer)) > 0){
System.out.write(buffer, 0, len);
}
}
}).start();
जबकि उस तरह का काम करता है, यह थोड़ा गंदा लगता है। और इसके शीर्ष पर, यह मुझे सही तरीके से प्रबंधित करने और समाप्त करने के लिए एक और धागा देता है। क्या ऐसा करने का कोई बेहतर तरीका है?
org.apache.commons.io.IOUtils.copy(new ProcessBuilder().command(commandLine) .redirectErrorStream(true).start().getInputStream(), System.out);