निम्नलिखित कोड पर विचार करें:
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
, क्योंकि अगर मैं भाषा बदलना चाहता हूं, तो मुझे अपने पार्सिंग कोड को उस भाषा में फिर से लिखने के लिए मजबूर होना पड़ेगा, जो पूरी तरह से एक नहीं है।
शेल कमांड को कॉल करते समय मैं जावा को पाइपिंग और पुनर्निर्देशन कैसे कर सकता हूं?
command | grep foo
आप command
जावा में मूल रूप से फ़िल्टरिंग कर रहे हैं। यह आपके कोड को कुछ अधिक जटिल बनाता है लेकिन आप समग्र संसाधन खपत और हमले की सतह को काफी कम कर देते हैं।