2010-09-22 12 views
20

जावा में कोई प्रक्रिया शुरू करने का कोई तरीका है? नेट में इस उदाहरण के लिए साथ किया जाता है:जावा में एक प्रक्रिया शुरू कर रहे हैं?

System.Diagnostics.Process.Start("processname"); 

वहाँ जावा में एक बराबर तो मैं तो उपयोगकर्ता अनुप्रयोग को खोजने के लिए दे सकते हैं और फिर इसे किसी भी ओएस के लिए काम करेंगे है?

उत्तर

23

http://www.rgagnon.com/javadetails/java-0014.html

import java.io.*; 
public class CmdExec { 

    public static void main(String args[]) { 
    try { 
     String line; 
     Process p = Runtime.getRuntime().exec 
     (System.getenv("windir") +"\\system32\\"+"tree.com /A"); 
     BufferedReader input = 
     new BufferedReader 
      (new InputStreamReader(p.getInputStream())); 
     while ((line = input.readLine()) != null) { 
     System.out.println(line); 
     } 
     input.close(); 
    } 
    catch (Exception err) { 
     err.printStackTrace(); 
    } 
    } 
} 

आप स्थानीय पथ प्राप्त कर सकते हैं:

तुम भी नए ProcessBuilder वर्ग है, जो यह आसान वातावरण चर बदलने के लिए और subprocesses आह्वान करने के लिए बनाता है की जांच के लिए चाहते हो सकता है सिस्टम गुणों या एक समान दृष्टिकोण का उपयोग कर।

http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

+5

ध्यान दें कि आपको विधि के '.exec (स्ट्रिंग [])' फ़ॉर्म का उपयोग करना चाहिए , एकल स्ट्रिंग '.exec (स्ट्रिंग)' फ़ॉर्म नहीं है जो * कमांड लाइन प्रोसेसर नहीं है * - यह बस रिक्त स्थान पर विभाजित होता है। वे इस उदाहरण के लिए 'tree.com/ए'' के लिए एक ही परिणाम देते हैं, लेकिन यदि दिए गए हैं तो अलग हैं, उदाहरण के लिए, एक फ़ाइल नाम जिसमें रिक्त स्थान हैं। –

+2

आपको त्रुटि स्ट्रीम भी फ्लश करना चाहिए और यदि आवश्यक हो तो प्रक्रिया आउटपुट मान की प्रतीक्षा करें। –

18

Runtime.exec() और Process कक्षा देखें। इसके सरलतम रूप में:

Process myProcess = Runtime.getRuntime().exec(command); 
... 

नोट आप भी इस प्रक्रिया 'उत्पादन पढ़ने की जरूरत है कि (जैसे: myProcess.getInputStream()) - या प्रक्रिया कुछ सिस्टम पर रखती हूँ। यह पहली बार भ्रमित हो सकता है, और इन एपीआई के किसी भी परिचय में शामिल किया जाना चाहिए। उदाहरण के लिए जेम्स पी की प्रतिक्रिया देखें।

Process myProcess = new ProcessBuilder(command, arg).start(); 
... 
+0

तुम भी प्रक्रिया के उत्पादन पढ़ने की जरूरत है - p.getInputStream() - या प्रक्रिया कुछ सिस्टम पर रखती हूँ। यह पहली बार भ्रमित हो सकता है, और इन एपीआई के किसी भी परिचय में शामिल किया जाना चाहिए। उदाहरण के लिए जेम्स पी की प्रतिक्रिया देखें। –

+0

@ एंडी धन्यवाद। यदि आपको कोई फर्क नहीं पड़ता तो मैंने आपकी टिप्पणी में आपके टिप्पणी को शामिल किया। – NullUserException

+0

क्या होगा यदि डिफ़ॉल्ट मीडिया प्लेयर वीएलसी है और मैं उदाहरण के लिए "somevideo.avi" खोलना चाहता हूं और मैं इसे डिफ़ॉल्ट अनुप्रयोग का उपयोग करना चाहता हूं जो vlc है? – jmasterx

7

जावा कक्षा लाइब्रेरी java.lang.Process वर्ग का उपयोग कर बाहरी प्रक्रियाओं का प्रतिनिधित्व करता है।

Process process = new ProcessBuilder("processname").start(); 

या पुराने java.lang.Runtime वर्ग पर अतिभारित exec तरीकों से अवगत कराया इंटरफ़ेस:: प्रक्रियाओं एक java.lang.ProcessBuilder का उपयोग कर उत्पन्न किया जा सकता

Process process = Runtime.getRuntime().exec("processname"); 

इन दोनों के टुकड़े कोड एक नई प्रक्रिया, अंडे होगा जो आम तौर पर असीमित रूप से निष्पादित करता है और परिणामी Process ऑब्जेक्ट के माध्यम से बातचीत की जा सकती है। यदि आपको यह जांचने की आवश्यकता है कि प्रक्रिया समाप्त हो गई है (या इसे समाप्त करने के लिए प्रतीक्षा करें), यह जांचना न भूलें कि process.exitValue() या process.waitFor() द्वारा लौटाया जाने वाला निकास मान (निकास कोड) अपेक्षित है (अधिकांश कार्यक्रमों के लिए 0), क्योंकि नहीं अगर प्रक्रिया असामान्य रूप से निकलती है तो अपवाद फेंक दिया जाता है।

भी ध्यान रखें कि अतिरिक्त कोड अक्सर आवश्यक सही ढंग से प्रक्रिया की आई/ओ को संभालने के लिए, documentation for the Process class में वर्णित के रूप (जोर जोड़ा) है:

डिफ़ॉल्ट रूप से, बनाया उपप्रक्रिया अपने स्वयं के टर्मिनल नहीं है या कंसोल। इसके सभी मानक I/O (यानी stdin, stdout, stderr) संचालन को मूल प्रक्रिया में रीडायरेक्ट किया जाएगा, जहां उन्हें आउटपुट आउटपुटस्ट्रीम(), getInputStream(), getErrorStream(), और getErrorStream() प्राप्त करने वाली विधियों का उपयोग करके प्राप्त किया जा सकता है। अभिभावक प्रक्रिया इनपुट को फ़ीड करने और उपप्रोसेसर से आउटपुट प्राप्त करने के लिए इन धाराओं का उपयोग करती है। चूंकि कुछ देशी प्लेटफ़ॉर्म केवल मानक इनपुट और आउटपुट स्ट्रीम के लिए सीमित बफर आकार प्रदान करते हैं, तत्काल इनपुट स्ट्रीम लिखने में विफलता या उपप्रोसेस की आउटपुट स्ट्रीम को पढ़ने में उपप्रोसेस को अवरुद्ध कर सकता है, या यहां तक ​​कि डेडलॉक भी हो सकता है।सुनिश्चित करें कि मैं/हे सही ढंग से नियंत्रित किया जाता है और जो बाहर निकलने मूल्य इंगित करता है सफलता jproc की तरह एक पुस्तकालय है कि stdout और stderr पर कब्जा करने की जटिलताओं के साथ संबंधित उपयोग करने के लिए है, और के लिए एक सरल तुल्यकालिक इंटरफ़ेस प्रदान करता है बनाने के लिए

एक ही रास्ता बाहरी प्रक्रियाओं चलाएँ:

ProcResult result = new ProcBuilder("processname").run(); 

jproc Maven केंद्रीय माध्यम से उपलब्ध है:

<dependency> 
     <groupId>org.buildobjects</groupId> 
     <artifactId>jproc</artifactId> 
     <version>2.2.0</version> 
</dependency> 
0

यहाँ तर्क है। लगता है हम जावा का उपयोग कर खिड़कियों में कैलकुलेटर चलाना चाहते हैं:

Process p = Runtime.getRuntime().exec(System.getenv("windir") + "\\system32\\" + "calc.exe"); 
संबंधित मुद्दे