java执行cmd命令
起因:项目需要实现jar包上传到远程私服仓库nexus,查询得有两种方法实现:1.调用nexus rest api 进行发行http请求,这个目前在研究;2.调用maven中的命令将本地仓库中的jar包推送到远程仓库;第二种方法虽然简单,但是扩展性不强,需要部署的服务器上有maven环境,并且在linux和Windows上若都要部署则需要进行系统适配。但不论如何,还是打算学习java执性cmd命令及打开其他程序的操作。本文参考了:https://www.jb51.net/article/80829.htm,https://www.cnblogs.com/zhufu9426/p/7928570.html
Java调用cmd命令,并输出显示信息:
/**
* execute cmd in current directory
* then get the inputStream and print on console
* the Most commonly used
* @throws InterruptedException
*/
@Test
public void executeDirCMD() throws InterruptedException {
try {
Runtime rt = Runtime.getRuntime();
// Process pr = rt.exec("cmd /c dir");
// Process pr = rt.exec("D:/APP/Evernote/Evernote.exe");//open evernote program
Process pr = rt.exec("D:/APP/Tim/Bin/QQScLauncher.exe");//open tim program
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream(),"GBK"));
String line = null;
while ((line = input.readLine())!=null){
System.out.println(line);
}
int exitValue = pr.waitFor();
System.out.println("Exited with error code "+exitValue);
} catch (IOException e) {
System.out.println(e.toString());
e.printStackTrace();
}
}
Java启动本机应用程序EXE的三种方式:
1.利用cmd方式
@Test
public void executeApplicationByCMD(){
String command = "D:/APP/Tim/Bin/QQScLauncher.exe";
Runtime rt = Runtime.getRuntime();
try {
Process pr = rt.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream(), "UTF-8"));
String line = null;
StringBuilder build = new StringBuilder();
while ((line = br.readLine()) != null) {
build.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
2.利用ProcessBuilder调用cmd方式
/**
* 启动应用程序
*
* @param programName
* @return
* @throws IOException
*/
public static void startProgram(String programPath) throws IOException {
log.info("启动应用程序:" + programPath);
if (StringUtils.isNotBlank(programPath)) {
try {
String programName = programPath.substring(programPath.lastIndexOf("/") + 1, programPath.lastIndexOf("."));
List<String> list = new ArrayList<String>();
list.add("cmd.exe");
list.add("/c");
list.add("start");
list.add("\"" + programName + "\"");
list.add("\"" + programPath + "\"");
ProcessBuilder pBuilder = new ProcessBuilder(list);
pBuilder.start();
} catch (Exception e) {
e.printStackTrace();
log.error("应用程序:" + programPath + "不存在!");
}
}
}
3.使用Desktop启动应用程序
/**
* execute By Desktop
*/
@Test
public void executeByDesktop(){
String programPath ="D:/APP/Tim/Bin/QQScLauncher.exe";
try {
Runtime.getRuntime().exec("notepad");
Desktop.getDesktop().open(new File(programPath));
} catch (IOException e) {
e.printStackTrace();
}
}
如果多次执行可能出现卡死现象,请参考:https://www.cnblogs.com/wang-liang-blogs/p/11022869.html
执行原理
常用命令详解
cmd /c dir 是执行完dir命令后关闭命令窗口。
cmd /k dir 是执行完dir命令后不关闭命令窗口。
cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。
cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。
注:增加了start,就会打开新窗口,可以用cmd /?查看帮助信息。
例:cmd /c copy d:\\test.txt e:将d盘的test文件复制到e盘,直接copy是识别不了为cmd命令的,所以在前面添加cmd /c来启动一个控制台应用程序;而如果是运行一个可执行程序,则直接将将command改为“F:\\apache-tomcat-6.0.20.exe”这样既可。
扩展资料
1.Java实现命令行中的进度条功能:参考:https://www.youkuaiyun.com/gather_23/NtjaMgxsMzY1LWJsb2cO0O0O.html
常常需要进行的系统适配
判断目前运行的是windows还是linux,可以使用:
Properties properties = System.getProperties();
String property = properties.getProperty("os.name");
System.out.println(property);
获取到运行的系统名,进行判断则可以使用:
/**
* 系统枚举类
*
* @author libowan
*/
public enum OSType {
LINUX,
WINDOWS,
OTHERS;
}
/**
* get current <code>OSType</code>
* @return OSType
*/
public static OSType getCurrentOSType(){
String s = System.getProperty("os.name").toLowerCase();
if (s.contains("linux")) return OSType.LINUX;
if (s.contains("windows")) return OSType.WINDOWS;
return OSType.OTHERS;
}
本文介绍了如何使用Java执行CMD命令,包括调用cmd命令并输出显示信息,启动本机应用程序EXE的三种方式,以及解决可能的卡死问题。同时提到了系统适配和命令详解等重要内容。

被折叠的 条评论
为什么被折叠?



