簡體   English   中英

如何將標准輸入重定向到Java Runtime.exec?

[英]how to redirect stdin to java Runtime.exec?

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

<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,並且沒有其他錯誤或輸出。

Exec向您返回一個Process對象。

進程具有getInputStream和getOutputStream方法。

只需使用它們來抓取輸入流並開始將字節推入其中。 不要忘記讀取輸出流,否則過程可能會阻塞。

重定向是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM