2010-04-01 13 views
5

मैं जावा की Runtime.exec विधि का उपयोग कर कुछ एसक्यूएल स्क्रिप्ट निष्पादित करना चाहता हूं। मैं mysql.exe/mysql.sh का आह्वान करना चाहता हूं और स्क्रिप्ट फ़ाइल को इस प्रक्रिया में रीडायरेक्ट करना चाहता हूं। कमांड प्रॉम्प्ट से मैं आदेशstdin को java Runtime.exec पर रीडायरेक्ट कैसे करें?

<mysqInstallDir\/bin\mysql.exe -u <userName> -p <password> < scripts\create_tables.sql 

मैं Runtime.exec का उपयोग कर mysql.exe आह्वान कर सकते हैं चला सकते हैं लेकिन मैं कैसे एसक्यूएल फ़ाइल से डेटा अनुप्रेषित करते mysql.exe के लिए?


मैं http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 में लेख पढ़ सकते हैं और StreamGobbler तंत्र का इस्तेमाल किया त्रुटि और आउटपुट स्ट्रीम प्राप्त करने के लिए। वहां कोई समस्या नहीं है। समस्या BufferedReader का उपयोग करके फ़ाइल को "स्क्रिप्ट \ create_tables.sql" पढ़ने और prcess के outputstream में सामग्री को पास करने में आता है। मैं प्रक्रिया को mysql.exe पर डेटा पास करने की अपेक्षा कर रहा था। लेकिन मुझे लगता है कि इस एसक्यूएल फ़ाइल से केवल पहली पंक्ति पढ़ी जाती है।

OutputStream outputstream = proc.getOutputStream(); 
OutputStreamWriter outputstreamwriter = new OutputStreamWriter(outputstream); 
BufferedWriter bufferedwriter = new BufferedWriter(outputstreamwriter); 
    while ((line = br.readLine()) != null) 
    { 
bufferedwriter.write(line); 
bufferedwriter.flush(); 
System.out.println(line); 
    } 
    bufferedwriter.flush(); 
    bufferedwriter.close(); 
    proc.waitFor() 

जब मैं ऐसा करता हूं तो मुझे लगता है कि create_tables.sql में केवल पहली पंक्ति निष्पादित की गई है। प्रक्रिया के लिए निकास कोड 0 है और कोई अन्य त्रुटि या आउटपुट नहीं है।

उत्तर

5

एक्सेक आपको एक प्रक्रिया ऑब्जेक्ट देता है।

प्रक्रिया इनपुट इनपुट प्राप्त करें और आउटपुटस्ट्रीम विधियां प्राप्त करें।

बस इनपुट स्ट्रीम को पकड़ने और इसमें बाइट्स को घुमाने के लिए उन लोगों का उपयोग करें। आउटपुट स्ट्रीम को पढ़ने के लिए मत भूलना या प्रक्रिया अवरुद्ध हो सकती है।

+0

का उपयोग कर और त्रुटि धारा, निश्चित रूप से कहते हैं। या प्रोसेसबिल्डर के रीडायरेक्ट एररस्ट्रीम (बूलियन) विधि के साथ आउटपुट और त्रुटि स्ट्रीम मर्ज करें, और मर्ज किए गए स्ट्रीम पढ़ें। –

1

पुनर्निर्देशन ओएस खोल/सेमीडी वातावरण की कार्यक्षमता है। उन्हें सही ढंग से आमंत्रित करने के लिए हमें Runtime.exec (स्ट्रिंग) के बजाय Runtime.exec (स्ट्रिंग []) का उपयोग करना चाहिए। यहां कोड है।

public Result executeCmd(String[] cmds, boolean waitForResult) 
{ 
    Result result = new Result(); 
    result.output = ""; 
    try 
    { 
     for(int i=0;i<cmds.length;i++) 
     { 
      System.out.println("CMD["+i+"]::"+cmds[i]); 
     } 
     System.out.println(""); 
     Process process = null; 
     if(cmds.length > 1) 
      process=Runtime.getRuntime().exec(cmds); 
     else 
      process=Runtime.getRuntime().exec(cmds[0]); 
     if (waitForResult) 
     { 
      StreamGobbler errordataReader = new StreamGobbler(process 
        .getErrorStream(), "ERROR"); 

      StreamGobbler outputdataReader = new StreamGobbler(process 
        .getInputStream(), "OUTPUT"); 

      errordataReader.start(); 
      outputdataReader.start(); 

      int exitVal = process.waitFor(); 
      errordataReader.join(); 
      outputdataReader.join(); 
      result.returnCode = exitVal; 
      result.output = outputdataReader.output; 
      result.error = errordataReader.output; 
     } 
    } 
    catch (Exception exp) 
    { 
     result.exp = exp; 
     result.returnCode = -1; 
    } 
    return result; 
} 

और इस विधि

Result result = executeCmd(cmds, true); 

जहां

CMD[0]::cmd 
CMD[1]::/c 
CMD[2]::.\mysql\bin\mysql --host=<hostname> --port=<portNum> -u <userName> < .\scripts\create_tables.sql 
संबंधित मुद्दे