2010-04-01 7 views
5

Ich möchte einige SQL-Skripte mit Java Runtime.exec Methode ausführen. Ich beabsichtige, mysql.exe/mysql.sh aufzurufen und die Skriptdatei an diesen Prozess umzuleiten. an der Eingabeaufforderung kann ich den BefehlWie stdin zu Java Runtime.exec umleiten?

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

betreibe ich mysql.exe mit Runtime.exec aufrufen können, aber wie kann ich umleiten Daten aus SQL-Datei mysql.exe?


las ich den Artikel in http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 und verwendet, um den StreamGobbler Mechanismus, um die Fehler und Ausgabeströme zu erhalten. Kein Problem dort. Das Problem tritt beim Lesen der Datei "scripts \ create_tables.sql" mit BufferedReader auf und übergibt den Inhalt an den Ausgangsstrom von process. Ich habe erwartet, dass der Prozess die Daten an die mysql.exe übergibt. Aber ich sehe, dass nur die erste Zeile aus dieser SQL-Datei gelesen wird.

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() 

Wenn ich dies tun sehe ich, dass nur die erste Zeile in create_tables.sql ausgeführt wird. Der Exit-Code für den Prozess ist 0 und es gibt keinen anderen Fehler oder Ausgabe.

Antwort

5

Exec gibt ein Process-Objekt an Sie zurück.

Der Prozess verfügt über die Methoden getInputStream und getOutputStream.

Verwenden Sie einfach diese, um den Eingabestrom zu greifen und Bytes hineinzuschieben. Vergessen Sie nicht, den Ausgabestream zu lesen oder der Prozess blockiert möglicherweise.

+0

und der Fehlerstrom, natürlich. Oder füge Ausgabe- und Fehler-Streams mit der redirectErrorStream (boolean) -Methode von ProcessBuilder zusammen und lese die zusammengeführten Streams. –

1

Umleitung ist eine Funktionalität der OS Shell/cmd-Umgebung. Um sie korrekt aufzurufen, sollten wir Runtime.exec (String []) anstelle von Runtime.exec (String) verwenden. Hier ist der Code.

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; 
} 

Und rufen Sie diese Methode mit

Result result = executeCmd(cmds, true); 

wo

CMD[0]::cmd 
CMD[1]::/c 
CMD[2]::.\mysql\bin\mysql --host=<hostname> --port=<portNum> -u <userName> < .\scripts\create_tables.sql