简述
我们常常会在cmd命令行中输入一些命令,如 cd切换目录,tree 获取文件树结构,或者java -jar 执行jar程序等,如果我们想要在Java代码中去执行cmd命令,并获得和在命令行小黑框中返回的内容,就需要用到Runtime这个API
基本应用
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
public class Main {
public static void main(String[] args) {
Runtime runtime = Runtime.getRuntime();
try {
Process process = runtime.exec("cmd /c explorer.exe");//执行命令:打开资源管理器
print(process,"GBK");//注:打开资源管理器,正常情况cmd并不会返回任何内容
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 打印输出
* @param process
* @param charset 编码格式,一般为GBK即可
*/
public static void print(Process process,String charset) {
try{
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName(charset)));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);//如果命令执行正常,则输出返回内容
}
BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream(),Charset.forName(charset)));
String errorLine;
while ((errorLine = error.readLine())!=null) {
System.out.println(errorLine);//如果命令执行错误,则获取并打印内容
}
}catch (Exception e){
e.printStackTrace();
}
}
}
执行Window cmd的注意项
可参考工具类
https://www.yuque.com/huangxiaowei-2hqfi/boylkh/gwmah6
命令前需加上 cmd /c的前缀
一般情况下,执行cmd命令需要加上 cmd /c的前缀
如打开记事本,在cmd执行为输入:notepad
但在代码中执行,则为:
Runtime.getRuntime().exec("cmd /c notepad")
对文件夹进行操作(如dir、tree)
- 在小黑框中对执行文件夹进行操作,通常需要通过cd等切换到指定目录才能执行,而在java中则不需要
如:我们需要获取E:\tool\ 文件夹下的树结构
在我们将小黑框切换到 E:\tool 目录下后,才可以执行 tree命令,如图:
而在Java代码中,我们可以调用另一个执行方法:
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c tree", null, new File("E:\\tool\\"));
print(process,"GBK");//如果文件夹存在,则打印文件树,否则打印错误信息
} catch (IOException e) {
e.printStackTrace();
}
注:runtime.exec(cmd) 等同于 runtime.exec(cmd,null,null)。
第三个参数其实意味着运行的文件夹,比如当我们并没有配置adb环境,但又想执行adb命令,第三个参数可以设置为adb.exe所在的文件夹就可以正常执行了。
如:
try {
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("adb version", null, new File("E:\\tool\\adbDir\\"));
print(process,"GBK");
} catch (IOException e) {
e.printStackTrace();
}
常用命令
cmd小黑框控制
打开小黑框
cmd /c start
关闭所有打开的小黑框
cmd.exe /C start wmic process where name='cmd.exe' call terminate
打开记事本
cmd /c notepad
打开资源管理器(文件管理器)
进入默认首页
cmd /c explorer.exe
进入指定文件夹
cmd /c explorer.exe E:\\tool\\
注:进入E盘的tool文件夹
读取指定文件夹
文件夹树结构
cmd /c tree
子文件的信息
cmd /c dir
关机
cmd /c shutdown -s-t 20
注:20秒后关机
shutdown -a
注:取消N秒后关机的任务
cmd /c at 12:05 shutdow /s /f
注:在12点05分关机
cmd /c at /delete
注:取消定时关机的任务
常见问题
CreateProcess error=2, 系统找不到指定的文件
如果该文件实际存在,则一般是因为命令前面没有加上 cmd /c的前缀。如执行 tree,则需要修改为 cmd /c tree
路径中存在空格(如:C:\Program Files (x86)\)的解决方案
将指令的命令包含在双引号“”,即可。
如:
java -jar C:\Program Files (x86)\Game.jar
java -jar "C:\Program Files (x86)\Game.jar"
这样就可以正常了。
同理:改成以下也是可以的:
"java" "-jar" "C:\Program Files (x86)\Game.jar"