2011-12-13 19 views
90

जावा एप्लिकेशन के भीतर इस कमांड लाइन को चलाने का कोई तरीका है?जावा में रनिंग कमांड लाइन

java -jar map.jar time.rel test.txt debug 

मैं इसे कमांड के साथ चला सकता हूं लेकिन मैं जावा के भीतर ऐसा नहीं कर सका।

+0

मैं कोशिश की है, क्रम आरटी = Runtime.getRuntime(); प्रक्रिया PROC = rt.exec ("पिंग स्थानीय होस्ट"); – Ataman

+0

क्या आप एक और वीएम के भीतर से वीएम लॉन्च करना चाहते हैं? – chance

उत्तर

141
Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec("java -jar map.jar time.rel test.txt debug"); 

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

+0

यह सामान्य है कि जब मैं इसे कंसोल करने के लिए आउटपुट करने का प्रयास करता हूं तो यह केवल कुछ ऐसा आउटपुट करता है: [email protected] – Ataman

+7

'pr.getInputStream()' का उपयोग करें। यहां एक विस्तृत उदाहरण दिया गया है: http://www.linglom.com/2007/06/06/how-to-run-command-line-or-execute-external-application-from-java/ – kol

+5

यह जांचना उपयोगी है कि क्या प्रक्रिया के साथ आता है। आप pr.waitFor() के साथ प्राप्त कर सकते हैं। तो ऐसा लगता है: 'int retval = pr.waitFor() '। तो यदि यह 0 नहीं है, तो आप निरस्त/साफ कर सकते हैं। – Shiki

3
Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
5
Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 
3

आप रनटाइम वर्ग के भीतर कार्यकारी आदेश की कोशिश की है? अगर आप किसी भी आगे की समस्याओं में चलाने

Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug") 

Runtime - Java Documentation

8
import java.io.*; 

Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

निम्नलिखित पर विचार करें, लेकिन मेरा अनुमान है कि यह है कि इसके बाद के संस्करण आप के लिए काम करेंगे:

Problems with Runtime.exec()

41

आप कर सकते हैं इस तरह के आउटपुट को भी देखें:

final Process p = Runtime.getRuntime().exec("java -jar map.jar time.rel test.txt debug"); 

new Thread(new Runnable() { 
    public void run() { 
    BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line = null; 

    try { 
     while ((line = input.readLine()) != null) 
      System.out.println(line); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
    } 
}).start(); 

p.waitFor(); 

और अगर आप विंडोज़ में चल रहे हैं, तो मत भूलना, आपको अपने कमांड के सामने "cmd/c" डालना होगा।

+4

आप यह समझने के लिए p.getErrorStream का भी उपयोग कर सकते हैं कि आपका आदेश क्यों टूटा हुआ है! – jakebeal

+0

@Craigo: आपके "cmd/c" कथन से संबंधित कोई संदर्भ? thx – Campa

+2

दरअसल, मुझे लगता है कि आपको "cmd/c" की आवश्यकता है, अगर आप विंडोज़ कमांड चलाने की इच्छा रखते हैं, जैसे "प्रतिलिपि"। भ्रम के लिए माफ़ी। – Craigo

14

अवरुद्ध होने वाली प्रक्रिया से बचने के लिए यदि यह मानक आउटपुट और/या त्रुटि पर बहुत अधिक डेटा आउटपुट करता है, तो आपको क्रेगो द्वारा प्रदान किए गए समाधान का उपयोग करना होगा। ध्यान दें कि ProcessBuilder Runtime.getRuntime()। Exec() से बेहतर है। यह कुछ कारणों से है: यह तर्कों को बेहतर बनाता है, और यह त्रुटि मानक आउटपुट का भी ख्याल रखता है (here भी देखें)।

ProcessBuilder builder = new ProcessBuilder("cmd", "arg1", ...); 
builder.redirectErrorStream(true); 
final Process process = builder.start(); 

// Watch the process 
watch(process); 

मैं इस डेटा को नए धागे में इकट्ठा करने के लिए एक नया फ़ंक्शन "घड़ी" का उपयोग करता हूं। कॉल किया गया प्रक्रिया समाप्त होने पर यह थ्रेड कॉलिंग प्रक्रिया में समाप्त हो जाएगा।

private static void watch(final Process process) { 
    new Thread() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String line = null; 
      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }.start(); 
} 
3

क्या

के बारे में
public class CmdExec { 

public static Scanner s = null; 


public static void main(String[] args) throws InterruptedException, IOException { 
    s = new Scanner(System.in); 
    System.out.print("$ "); 
    String cmd = s.nextLine(); 
    final Process p = Runtime.getRuntime().exec(cmd); 

    new Thread(new Runnable() { 
     public void run() { 
      BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      String line = null; 

      try { 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }).start(); 

    p.waitFor(); 
    } 

} 
संबंधित मुद्दे