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

举个栗子:

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.txt
			File 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













评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值