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
阅读全文
0 0
- Java调用cmd命令遇到的坑总结
- C# 调用 CMD 命令 遇到的问题
- java调用cmd命令
- JAVA调用CMD命令
- Java 调用CMD 命令
- java调用CMD命令
- Java调用CMD命令
- Java调用CMD命令
- Java调用CMD命令
- JAVA 调用cmd命令
- Java调用CMD命令
- Java 调用CMD 命令
- JAVA 调用CMD命令
- Java 调用cmd命令
- java调用cmd命令
- Java调用CMD命令
- java调用cmd命令
- java 调用 windows 的 cmd 命令
- Linux设置系统时间
- 了解Java线程的start方法如何回调run方法
- Java连接mongodb存取数据时调整日志输出级别
- spring cloud day06【Zuul-APIGateway】
- 前端html img src base64 的data 的类型参数
- Java调用cmd命令遇到的坑总结
- 动画播放器的控制动画和音频的播放和暂停
- Hibernate实例实现(注解方式)添加两张关系表
- MyApplication ImageUtils
- GreenDao的使用
- 网络工程学习笔记
- 音悦台视频、MV免费下载工具
- 不同html页面 相同部分代码的提取
- 通过maven查看依赖jar的源码