关于JAVA Project.waitfor()返回值是1
Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明。
这时对源代码调试了一下,发现Project=null.而去根目录下点击被调用的bat文件发现也可以被正确执行。
这时想到应该将标准错误流的信息打印出来,发现是bat文件的路径只获取到了第一个空格前。所以问题的原因是空格导致文件路径不能被获取。
原先的代码
String batpath = file.getCanonicalPath() + "\resources\runTest.bat"; //run bat file Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath); int exitcode=project.waitFor(); //kill the process project.destroy(); logger.info(exitcode);
修改后的代码
//run bat file Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath.replaceAll(" ", "" ""));
此次解决问题的经验是:
不要盲目的先去网上找答案,要先将自己的程序调试一下,将错误信息打印出来,然后针对错误信息有针对性的去网上找答案。这样做比较有效。
自己结论:
java 代码中调用cmd 命令执行 mysql 脚本结果 cmd 命令返回结果为1的问题:
Process process = Runtime.getRuntime().exec(cmd); int waitFor = process.waitFor();
上边waitFor值为1,而值为0才是执行正常,那我怎么才能知道这个执行结果是因为什么出错的呢?可以把出错信息打印出来就行了,process对象 有一个异常流,打印一下就好了:
FileInputStream errorStream = (FileInputStream)process.getErrorStream();
InputStreamReader isr = new InputStreamReader(errorStream,"gbk");//读取
System.out.println(isr.getEncoding());
BufferedReader bufr = new BufferedReader(isr);//缓冲
String line = null;
while((line =bufr.readLine())!=null) {
System.out.println(line);
}
isr.close();
结果发现打印的语句是:mysqldump 不是内部命令...
可以发现 执行结果不正确是因为 这个mysql的命令 没法使用造成的,去找这个原因就可以了。
这个问题明显是mysql的环境变量中path路径没配mysql路径,但由于mysql软件安装时系统是默认配的,为啥这里还是不能用mysql命令,而c盘根目录却可以用的,最后查原因是需要重启电脑,intellj 中才能使用刚装的mysql服务。
|