2016-05-02 2 views
1

finden kann ich ProcessBuilder bin mit einem mysqldump von Java-Code auszuführen und dies ist mein CodeProcess Builder verursacht error2 nicht Pfad angegeben, obwohl der Befehl ausgeführt von cmd

public static void executeCommant(String... command) throws Exception { 
     ProcessBuilder processBuilder = null; 
     processBuilder = new ProcessBuilder(command); 

     processBuilder.redirectErrorStream(true); 
     Process process = processBuilder.start(); 

     int resultCode = process.waitFor(); 

     if (resultCode != 0) { 
      throw new Exception("" + readCommandOutput(process.getInputStream())); 
     } 
    } 
private static String readCommandOutput(InputStream inputStream) throws IOException { 
     StringBuilder sb = new StringBuilder(); 
     BufferedReader br = null; 
     try { 
      br = new BufferedReader(new InputStreamReader(inputStream)); 
      String line = null; 
      while ((line = br.readLine()) != null) { 
       sb.append(line + System.getProperty("line.separator")); 
      } 
     } finally { 
      br.close(); 
     } 
     return sb.toString(); 
    } 

public static void main(String[] args) throws Exception { 

     executeCommant("mysqldump -u root -P 3316 -h localhost > G:\\test.sql"); 

    } 

Problem ist, ich die folgende Ausnahme erhalten, auch obwohl wenn ich denselben Befehl von cmd ausführe, bekomme ich kein Problem, und ich kann nur nicht herausfinden, warum es die angegebene Datei nicht finden kann !! PS: Ich habe versucht, den vollständigen Pfad für die mysqldump.exe mit geben und bekam das gleiche Ergebnis

Exception in thread "main" java.io.IOException: Cannot run program "mysqldump -u root -P 3316 -h localhost > G:\test.sql": CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:470) 
    at com.etq.e2mc.platform.windows.WindowsProcess.executeCommant(WindowsProcess.java:46) 
    at com.etq.e2mc.platform.windows.WindowsProcess.main(WindowsProcess.java:67) 
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified 
    at java.lang.ProcessImpl.create(Native Method) 
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:177) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:28) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452) 
    ... 2 more 

Antwort

1

Zuerst Ihr sind die ProcessBuilder(String... command) mit einem Array aufrufen, was bedeutet, dass der erste Wert des Arrays ist das Programm. Sie senden jedoch die gesamte Zeichenfolge "mysqldump -u root -P 3316 -h localhost > G:\\test.sql", und das ist kein Programm. Nur mysqldump ist das Programm.

Zweitens, wenn Ausgang getInputStream() mit aufnehmen, was Sie tun müssen, dass vorwaitFor() Aufruf, sonst das Risiko des Ausgabepuffer voll läuft, wird die Ausführung des Programms zu stoppen Sie laufen, im Wesentlichen ein Deadlock zwischen Ihrem Programm Warte verursacht für den Befehl zum Beenden und den Befehl, der darauf wartet, dass Sie die Ausgabe lesen. Wenn Sie den Stream benötigen, müssen Sie ihn in der Regel in einem separaten Thread lesen.

Drittens können Sie die Ausgabe nicht umleiten, indem Sie > in der Befehlszeichenfolge verwenden. Das ist etwas, das cmd.exe tut, und Sie rufen cmd.exe nicht auf. Da Sie in eine Datei umleiten möchten, tun Sie dies direkt mit der ProcessBuilder.

ProcessBuilder processBuilder = new ProcessBuilder(
     "mysqldump", "-u", "root", "-P", "3316", "-h", "localhost"); 
processBuilder.redirectErrorStream(true); 
processBuilder.redirectOutput(new File("G:\\test.sql")); 
Process process = processBuilder.start(); 
int resultCode = process.waitFor(); 
if (resultCode != 0) { 
    throw new Exception("Program failed with error " + resultCode); 
} 
+0

vielen Dank für die wertvolle Information Ich ehrlich gesagt nicht, dass wusste, ich den Code versuchen Sie geschrieben und bin immer 'Die Methode redirectOutput (Datei) ist nicht definiert für den Typen ProcessBuilder', Sie haben keinen anderen Vorschlag Wie soll ich die Ausgabe umleiten ?, soll ich nur cmd aufrufen und dann mysqldump ?? - PS: Ich benutze Java 6 und kann nicht upgraden, da viel nicht auf Java getestet wird. 7 – user1

+0

Dann müssen Sie einen eigenen Thread schreiben, um Daten aus dem von 'getInputStream()' zurückgegebenen Eingabedatenstrom in die Datei zu pumpen. – Andreas

Verwandte Themen