如何将stdin重定向到java Runtime.exec?

时间:2010-04-01 20:10:09

标签: java redirect stdin 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的输出流。我期待Process将数据传递给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,并且没有其他错误或输出。

2 个答案:

答案 0 :(得分:5)

Exec向您返回一个Process对象。

进程有getInputStream和getOutputStream方法。

只需使用它们来获取输入流并开始将字节推入其中。不要忘记阅读输出流或过程可能会阻止。

答案 1 :(得分: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