2010-04-01 120 views
5

我想用Java的Runtime.exec方法執行一些sql腳本。我打算調用mysql.exe/mysql.sh並將腳本文件重定向到此進程。 從命令提示符下,我可以運行命令如何將stdin重定向到java Runtime.exec?

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

我可以使用的Runtime.exec調用的mysql.exe但我怎麼重定向從SQL文件數據的mysql.exe?


http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4閱讀文章和所使用的StreamGobbler機制獲得錯誤和輸出流。那裏沒問題。問題出現在使用BufferedReader讀取文件「scripts \ create_tables.sql」並將內容傳遞給prcess的輸出流。我期待過程將數據傳遞給mysql.exe。但是我發現只有第一行是從這個sql文件中讀取的。

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

Exec向您返回一個Process對象。

進程有getInputStream和getOutputStream方法。

只需使用它們來抓取輸入流並開始向其中推送字節即可。不要忘記讀取輸出流或者進程可能會阻塞。

+0

錯誤流這個方法當然而且,。或者將輸出和錯誤流與ProcessBuilder的redirectErrorStream(boolean)方法合併,並讀取合併的流。 – 2010-04-05 16:35:15

1

重定向是OS shell/cmd環境的功能。爲了正確調用它們,我們應該使用Runtime.exec(String [])而不是Runtime.exec(String)。 這是代碼。

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