近日,在毕业设计里面遇到了这样一个情景:需要在web项目运行时,动态地对一个已有的项目进行打包操作。
由于,之前在一些项目中,曾经遇到过相似的情况,因此,我把解决问题的方案定位到Runtime这个类上。
说起Runtime这个类,说实在用的不是很多,之前在项目中用到这个类主要是通过Runtime获取JVM的运行时环境,从而执行window命令来获取机器的mac地址,下面简单列举一下,如果利用Runtime获取执行window命令“ipconfig -all”,至于如果获得mac地址,应该不用我说了吧,自己搞个正则表达式匹配一下就可以啦.
StringBuilder sb = new StringBuilder();
sb.append("ipconfig -all");
try {
Process process = Runtime.getRuntime().exec(sb.toString());
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
如果要执行其他命令的话,方法类似,我就不再一一举例了。下面,我再把几点个人总结在下面列一下,好让你别走弯路。
1.如果要执行一些cmd命令,很多时候,如果像上面ipconfig一样直接往exec方面里塞的话,很可能会报错,说不支持该命令。解决的办法就是把cmd控制台打开吧,命令如下:“cmd /C cd D:/folderA/floderB”,首先要说明一下,通过这种方式打开的控制台,其默认的路径,就是当前文件的路径,如果要想转到目录A/目录B下搞些什么搞错,就可以用上面的命令。但是上面的命令简直就是没有意义的,它只是把cmd的默认目录改一下,除此之外什么也没干。如果要执行多条命令怎么办呢?我们可以利用“&&”与运算,不懂这个操作符的自己查书吧。好了,我们把命令改一下,"cmd /C cd D:/folderA/floderB && mkdir abc".好了。这样,我们就可以在D:/folderA/floderB目录下,新建一个叫做abc的目录了。
2.还是用上面控制台cmd命令来说吧,假如你执行的命令,没有返回值的话,你可以就Runtime.getRuntime().exec(command);这样把命令很好地执行。但是假如你执行的命令,在执行的过程中要在控制台打印些东西,那么你就要多写些代码了,否则,你的程序不会自动执行,看上次貌似卡死了。其实并不是这样,当命令执行的时候,jdk把命令的输出送到缓存区里面去了,并且,我发现,如果你不把缓存区清空的话,程序是不会结束的,也就是说,你所执行的命令是未执行结束的,尽管你在你自己的调试输出中看起来时结束了。这个时候,必须要把Process process = Runtime.getRuntime().exec(command);用上,process是一个子进程,它有两个可以获取缓存区内容的方法,一个是process.getErrorStream()用来获取命令执行出错的信息,另一个是process.getInputStream()用来获取命令执行的正常输出。好了,如果你遇到了程序不能正常自动结束的话,通过这两个方法,返回一个InputStream对象,再把这个对象read()干净,这样,你的程序就可以自动正常结束了。
3.有时候,在控制台输出的是中文,要注意选好读操作类,不然输出的是中文是乱码。