प्रोसेसबिल्डर के लिए नॉन-ब्लॉकिंग आउटपुट रीडायरेक्शन
जावा में प्रक्रियाओं को निष्पादित करने के लिए, प्रोसेसबिल्डर एक सुविधाजनक दृष्टिकोण प्रदान करता है। हालाँकि, चुनौती तब उत्पन्न होती है जब हमें निष्पादित प्रक्रिया के stdout और stderr स्ट्रीम को System.out पर अतुल्यकालिक रूप से पुनर्निर्देशित करने की आवश्यकता होती है।
थ्रेड का उपयोग करके अतुल्यकालिक पुनर्निर्देशन
एक सामान्य विधि इसमें मैन्युअल रूप से एक नया थ्रेड तैयार करना शामिल है जो लगातार stdOut से पढ़ता है और System.out पर लिखता है। कार्यात्मक होते हुए भी, यह दृष्टिकोण अतिरिक्त थ्रेड प्रबंधन ओवरहेड बनाता है। समाधान: प्रोसेसबिल्डर.इनहेरिटआईओ। यह विधि मूल जावा प्रक्रिया को प्राप्त करने के लिए उपप्रक्रिया की मानक I/O स्ट्रीम सेट करती है। कमांड("कमांड1").स्टार्ट();
पहले के जावा के लिए वैकल्पिक संस्करण
7 से पहले के जावा संस्करणों के लिए, निम्नलिखित कार्यान्वयन का उपयोग किया जा सकता है:
import java.io.*; आयात java.util.स्कैनर; आयात java.util.concurrent.ExecutorService; आयात java.util.concurrent.Executors; सार्वजनिक वर्ग नॉनब्लॉकिंगआउटपुटरिडायरेक्शन { सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] args) अपवाद फेंकता है { निष्पादक सेवा निष्पादक सेवा = निष्पादक.newSingleThreadExecutor(); प्रक्रिया p = Runtime.getRuntime().exec('cmd /c dir'); inheritIO(p.getInputStream(), System.out, निष्पादकसेवा); inheritIO(p.getErrorStream(), System.err, executorService); } निजी स्थैतिक शून्य इनहेरिटियो (अंतिम इनपुटस्ट्रीम स्रोत, अंतिम प्रिंटस्ट्रीम गंतव्य, निष्पादक सेवा निष्पादक सेवा) { executorService.execute(() -> { स्कैनर स्कैनर = नया स्कैनर (src); जबकि (scanner.hasNextLine()) { dest.println(scanner.nextLine()); } }); executorService.shutdown(); } }
Process p = new ProcessBuilder().inheritIO().command("command1").start();इस विधि के लाभ
यह विधि कई लाभ प्रदान करती है:
import java.io.*; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NonBlockingOutputRedirection { public static void main(String[] args) throws Exception { ExecutorService executorService = Executors.newSingleThreadExecutor(); Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out, executorService); inheritIO(p.getErrorStream(), System.err, executorService); } private static void inheritIO(final InputStream src, final PrintStream dest, ExecutorService executorService) { executorService.execute(() -> { Scanner scanner = new Scanner(src); while (scanner.hasNextLine()) { dest.println(scanner.nextLine()); } }); executorService.shutdown(); } }आउटपुट पुनर्निर्देशन होता है पृष्ठभूमि, मुख्य थ्रेड को मुक्त कर रही है।
स्वचालित थ्रेड समाप्ति:
जब उपप्रक्रिया पूरी हो जाती है, तो आउटपुट पुनर्निर्देशन के लिए जिम्मेदार थ्रेड इनपुट स्ट्रीम पर फ़ाइल के अंत के कारण स्वचालित रूप से समाप्त हो जाएंगे।अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3