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

我想使用Java的Runtime.exec方法执行一些sql脚本。 我打算调用mysql.exe / mysql.sh并将脚本文件重定向到此进程。 从命令提示符我可以运行该命令

<mysqInstallDir\/bin\mysql.exe -u  -p  < 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,并且没有其他错误或输出。

Exec向您返回一个Process对象。

Process有getInputStream和getOutputStream方法。

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

重定向是OS shell / cmd环境的function。 要正确调用它们,我们应该使用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 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= --port= -u  < .\scripts\create_tables.sql