[英]Can Java Runtime.exec another java program that uses stdin?
[英]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.