举个栗子:
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