दिलचस्प पोस्ट
मैं सी # में एक स्ट्रिंग को enum में कैसे रूपांतरित करूँ? रेल में फ़ाइल डाउनलोड लिंक सीकेके से आने वाली सी फ़ाइलों के लिए सी + लिखने के संदर्भ में विधि वापसी मान का उपयोग नहीं कर सकते विज़ुअल स्टूडियो 2015 यूनिट परीक्षणों को नहीं खोजता है जावा – 'यह' कीवर्ड का उपयोग करने के लिए आर के साथ एक .eps फ़ाइल को ग्राफ़ निर्यात करें आईओएस 8 कस्टम कीबोर्ड: ऊँचाई बदलना मैक्रोज़ में जाहिरा तौर पर अर्थहीन करते-करते और if-else बयान क्यों का उपयोग करें? एंड्रॉइड: एक बटन या छवि बटन पर पाठ और छवि का संयोजन स्विफ्ट शब्दकोश मूल्य के लिए कुंजी प्राप्त करें क्या मैं स्क्रॉल वीआईएल को प्रोग्राम में एंड्रॉइड स्क्रॉल कर सकता हूं? क्या कार्यात्मक प्रोग्रामिंग गोफ डिजाइन पैटर्न को बदलता है? IPhone के लिए स्वचालित परीक्षण Maven2: एंटरप्राइज़ प्रोजेक्ट (ईएआर फ़ाइल) के लिए सर्वश्रेष्ठ अभ्यास

Runtime.exec () के साथ पाइप कैसे काम करें?

निम्नलिखित कोड पर विचार करें:

String commandf = "ls /etc | grep release"; try { // Execute the command and wait for it to complete Process child = Runtime.getRuntime().exec(commandf); child.waitFor(); // Print the first 16 bytes of its output InputStream i = child.getInputStream(); byte[] b = new byte[16]; i.read(b, 0, b.length); System.out.println(new String(b)); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } 

प्रोग्राम का आउटपुट है:

 /etc: adduser.co 

जब मैं शेल से चलाता हूं, ज़ाहिर है, यह अपेक्षित रूप से कार्य करता है:

 poundifdef@parker:~/rabbit_test$ ls /etc | grep release lsb-release 

इन्टरनेट मुझे बताते हैं कि, इस तथ्य के कारण कि पाइप का व्यवहार क्रॉस-प्लेटफॉर्म नहीं है, जावा फ़ैक्टरी उत्पादक जावा में काम करने वाले प्रतिभाशाली दिमाग पाइप काम करने की गारंटी नहीं दे सकते।

मैं यह कैसे कर सकता हूँ?

मैं grep और sed बजाय जावा निर्माणों का उपयोग करके अपने सभी पार्सिंग करने नहीं जा रहा हूं, क्योंकि अगर मैं भाषा को बदलना चाहता हूं, तो मुझे उस भाषा में अपना पार्सिंग कोड दोबारा लिखना अनिवार्य होगा, चले जाओ।

शेल कमानों को कॉल करते समय मैं जावा को पाइपिंग और पुनर्निर्देशन कैसे कर सकता / सकती हूं?

वेब के समाधान से एकत्रित समाधान "Runtime.exec () के साथ पाइप कैसे काम करें?"

एक स्क्रिप्ट लिखें और अलग-अलग आज्ञाओं के बजाय स्क्रिप्ट निष्पादित करें।

पाइप खोल का एक हिस्सा है, इसलिए आप ऐसा कुछ भी कर सकते हैं:

 String[] cmd = { "/bin/sh", "-c", "ls /etc | grep release" }; Process p = Runtime.getRuntime().exec(cmd); 

मैं लिनक्स में इसी तरह की समस्या में था, सिवाय इसके कि "ps -ef | grep someprocess" था।
कम से कम "एलएस" के साथ आपके पास एक भाषा-स्वतंत्र (यद्यपि मंद) जावा प्रतिस्थापन है उदाहरण के लिए .:

 File f = new File("C:\\"); String[] files = f.listFiles(new File("/home/tihamer")); for (String file : files) { if (file.matches(.*some.*)) { System.out.println(file); } } 

"पीएस" के साथ, यह थोड़ा कठिन है, क्योंकि जावा में इसके लिए एपीआई नहीं है।

मैंने सुना है कि सिगार हमारी मदद कर सकता है: https://support.hyperic.com/display/SIGAR/Home

सरलतम समाधान, हालांकि, (जैसा कि काज द्वारा बताया गया है) एक स्ट्रिंग सरणी के रूप में पाइप कमांड को निष्पादित करना है। यहां पूर्ण कोड है:

 try { String line; String[] cmd = { "/bin/sh", "-c", "ps -ef | grep export" }; Process p = Runtime.getRuntime().exec(cmd); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); } catch (Exception ex) { ex.printStackTrace(); } 

के रूप में स्ट्रिंग सरणी पाइप के साथ काम करती है, जबकि एक स्ट्रिंग नहीं होती है … यह ब्रह्मांड के रहस्यों में से एक है (विशेषकर यदि आपने स्रोत कोड नहीं पढ़ा है)। मुझे संदेह है कि यह इसलिए है क्योंकि जब exec को एक स्ट्रिंग दिया जाता है, तो यह पहले इसे पर्स करता है (एक तरह से जिसे हम पसंद नहीं करते हैं)। इसके विपरीत, जब exec को एक स्ट्रिंग सरणी दी जाती है, तो यह इसे पारित किए बिना ऑपरेटिंग सिस्टम पर गुजरता है।

दरअसल, अगर हम व्यस्त दिन से बाहर समय लेते हैं और स्रोत कोड को देखते हैं ( http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/ पर रनटाइम.जावा # रनटाइम.एक्सएक% 28java.lang.String% 2Cjava.lang.String []% 2Cjava.io.File% 29 ), हम पाते हैं कि वास्तव में क्या हो रहा है:

 public Process [More ...] exec(String command, String[] envp, File dir) throws IOException { if (command.length() == 0) throw new IllegalArgumentException("Empty command"); StringTokenizer st = new StringTokenizer(command); String[] cmdarray = new String[st.countTokens()]; for (int i = 0; st.hasMoreTokens(); i++) cmdarray[i] = st.nextToken(); return exec(cmdarray, envp, dir); } 

प्रत्येक प्रक्रिया को चलाने के लिए एक रनटाइम बनाएं आउटपुटस्ट्रीम को पहली रनटाइम से प्राप्त करें और इसे दूसरे एक से इनटस्टस्ट्रीम में कॉपी करें।