Java调用cmd命令遇到的坑总结

来源:互联网 发布:vi是什么软件 编辑:程序博客网 时间:2024/05/29 18:01

举个栗子:

public class test {public static void main(String[] args){//执行计算execute("c:\\folder","book.txt");}public static void execute(String path, String inpFileName){Runtime rm = Runtime.getRuntime();try {//将c盘folder下的book.txt复制一份命名为book222.txt,放在c盘folder下String step = "cmd /c copy c:\\folder\\book.txt c:\\folder\\book222.txt";//执行命令Process process = rm.exec(step);System.out.println("执行完毕");//关闭流释放资源if(process != null){process.getOutputStream().close();}InputStream in = process.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String tmp = null;while ((tmp = br.readLine()) != null) {}//执行完毕之后将cmd命令复制的book222.txt 用Java代码复制到book333.txtFile result = new File("c:\\folder" + File.separator + "book333.txt");FileInputStream fis = new FileInputStream(new File("c:\\folder\\book222.txt"));FileOutputStream fos = new FileOutputStream(result);int len;byte[] b = new byte[1024];while((len = fis.read(b)) != -1){fos.write(b, 0, len);}}catch(Exception e){e.printStackTrace();System.out.println("执行命令时出错");}}public static void print(Process process) throws Exception{//以下为读取cmd窗口返回的内容BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));StringBuffer sb = new StringBuffer();        String line = null;        while ((line = bufferedReader.readLine()) != null) {              sb.append(line).append("\n");        }        System.out.println(sb.toString());}}




坑总结:


cmd命令中 "/" 符号和 "\"符号

\是cmd命令中的路径分隔符 比如C:\Users\SYSTEM32/是命令参数后缀,比如  format /q

所以在java中拼cmd的命令时的路径 要用转义符"\" 写成"\\"


cmd中运行的好好的命令, java调用时候怎么报错呢?

我们在cmd中直接输入  del  c:\test\book.txt 键入回车,会直接将 对应路径下的book.txt删除
但是在java中执行 rm.exec("del c:\\test\\book.txt")就会报java.io.IOException: Cannot run program "del"
这是why?
这里总结一下, Java中调用cmd命令, 要开局一个 cmd /c ……
如: String command = "cmd /c del c:\\test\\book.txt "

总结一下 cmd /c 和 cmd /k 的区别:

cmd /c dir:是执行完dir命令后关闭命令窗口;

cmd /k dir:是执行完dir命令后不关闭命令窗口。

cmd /c start dir:会打开一个新窗口后执行dir指令,原窗口会关闭;

cmd /k start dir:会打开一个新窗口后执行dir指令,原窗口不会关闭。



比如我的命令是运行某个bat程序, 之后会生成一个文件, 然后我要通过java代码把这个文件复制到另一个地方,可是bat程序还没有运行完毕就执行了Java代码,导致找不到文件, 那么我们该如何判断cmd命令是否运行完毕并在运行完毕后进行操作呢?

首先看到网上有说用process.waitFor()方法的,这个方法具体是干嘛的反正我没试出来效果, 只是调用了以后程序就会停到那,不往下走了,并没有解决我的问题, 然后发现可以通过流读取打印cmd的输出,于是用以下办法
Process process = rm.exec(step);//关闭流释放资源if(process != null){process.getOutputStream().close();}InputStream in = process.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String tmp = null;while ((tmp = br.readLine()) != null) {// do nothing...啥也不干}//代码执行到while循环以外,就说明cmd命令执行完毕了,文件也生成了,就可以进行我们的复制或其它操作了……
需要注意的是, 调用完exec命令后, 要首先关闭process的outputStream, 然后再读取, 不然程序依然会卡到那里不动


exec()完命令后弹出的黑框框停那不动了,也不向下执行是为什么?

Process process = rm.exec(command);//关闭流释放资源if(process != null){process.getOutputStream().close();}
调用完exec方法后, 要通过以上方式关流, 才能正确继续向下执行,不知道为啥,这是我试出来的,参考上一条,不知是所有情况下都会发生,还是关流和打印一起使用时候的矛盾



如何一次调用执行多条cmd指令?

在命令字符串中使用"&&" 拼接多条命令



复制文件时候还遇见了一个java.io.FileNotFoundException(拒绝访问。) 的错误

这是一个非常初级的知识,因为有一段时间没有操作I/O流了, 而且感觉这里内容太简单,就随便那么一写,没想到有些问题没注意到, 开始还以为是复制到c盘时候的权限问题, 浪费了一些不必要的时间。

解决方法见 : http://blog.csdn.net/w405722907/article/details/78610485













原创粉丝点击