JAVA:调用cmd指令(支持多次手工输入)
JDK开发环境:1.8
package com.le.tool; import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.nio.charset.Charset; /**
* java调用cmd指令工具类
*
* @author le.li
*
*/
public class ExecuteUtil {
/**
* 避免乱码,如果没有传入语言编号,默认使用英文437<br>
* D:\>chcp /? 显示或设置活动代码页编号。<br>
* CHCP [nnn]<br>
* nnn 指定代码页编号。<br>
* 不带参数键入 CHCP 以显示活动代码页编号。<br>
*/
private static final String DEFAULT_LANGUAGE_CODE = "437"; /**
* window系统默认语言:GBK
*/
private static final String DEFAULT_LANGUAGE = "GBK"; public static void main(String[] args) {
// executeLink(); // executeCmd("dir ."); // 举例直接把bat文件当cmd指令调用
String cmd = null;
String fileName = "test.bat";
File f = new File(".");
try {
cmd = f.getCanonicalPath() + File.separator + fileName;
} catch (IOException e) {
// e.printStackTrace();
System.err.println("get cmd file error.");
}
executeCmd(cmd);
} /**
* 获取操作系统默认语言
*
* @return String
* @see java虚拟机启动默认的编码(一般和java文件设置格式一致)<br>
* System.out.println(Charset.defaultCharset());<br>
* 查看预置的变量信息:System.getProperties().list(System.out);<br>
* 属性:<br>
* 文件编码:file.encoding<br>
* 系统默认编码sun.jnu.encoding
*/
private static String getsystemLanguage() {
return null == System.getProperty("sun.jnu.encoding") ? DEFAULT_LANGUAGE
: System.getProperty("sun.jnu.encoding");
} /**
* 执行cmd指令
* @param cmd 执行指令
*/
public static void executeCmd(String cmd) {
executeLink(DEFAULT_LANGUAGE_CODE, true, cmd);
} /**
* cmd手工输入交互处理窗口
*/
public static void executeLink() {
executeLink(DEFAULT_LANGUAGE_CODE, false, "");
} /**
* cmd交互处理窗口
*
* @param languageCode 系统语言编码
* @param isOneRun 只执行cmd指令
* @param cmd 执行的指令
* @see 在中文windows系统中,根据编码需要设置编码 chcp 65001 就是换成UTF-8代码页<br>
* chcp 936 可以换回默认的GBK<br>
* chcp 437 是美国英语 <br>
*/
public static void executeLink(String languageCode, boolean isOneRun, String cmd) {
try {
String cmdBin = "cmd";
if (isOneRun) {
cmdBin = "cmd /c ";
}
Process process = Runtime.getRuntime().exec(cmdBin + cmd);
PrintWriter writer = new PrintWriter(process.getOutputStream());
if (!isOneRun) {
// 此处可以预置交互指令
// writer.println("chcp " + languageCode);
writer.println("echo Hello World.");
writer.flush();
}
CommandThread commandThread = new CommandThread(writer);
commandThread.setName("ExecuteCmdThread");
commandThread.start();
ProcessInputStreamThread inputThread = new ProcessInputStreamThread(process.getInputStream());
ProcessInputStreamThread errorThread = new ProcessInputStreamThread(process.getErrorStream());
inputThread.setName("InputStreamThread");
inputThread.start();
errorThread.setName("ErrorStreamThread");
errorThread.start();
// 即使添加下边的一句也不会使线程结束
// Thread.currentThread().interrupt();
} catch (Exception e) {
e.printStackTrace();
}
} static class CommandThread extends Thread {
PrintWriter writer;
BufferedReader br = null; CommandThread(PrintWriter writer) {
this.writer = writer;
// 避免出现乱码问题,直接使用系统默认的编码格式
br = new BufferedReader(new InputStreamReader(System.in, Charset.forName(getsystemLanguage())));
this.setDaemon(true);
} @Override
public void run() {
try {
String cmd = null;
while ((cmd = br.readLine()) != null) {
writer.println(cmd);
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != writer) {
writer.close();
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} static class ProcessInputStreamThread extends Thread { InputStream input;
BufferedReader breader = null; ProcessInputStreamThread(InputStream input) {
this.input = input;
// 避免出现乱码问题,直接使用系统默认的编码格式
breader = new BufferedReader(new InputStreamReader(input, Charset.forName(getsystemLanguage())));
} @Override
public void run() {
try {
String str = null;
while ((str = breader.readLine()) != null) {
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != input) {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (null != breader) {
try {
breader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
JAVA:调用cmd指令(支持多次手工输入)的更多相关文章
- java调用cmd执行maven命令
一.原理介绍 Java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后封闭命令窗口. cmd /k di ...
- Java调用CMD命令
java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完d ...
- Java调用cmd命令 打开一个站点
使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来 怕是忘记,须要时能 ...
- Java 调用cmd.exe命令
原理:java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是 ...
- Java调用cmd压缩文件
今天在做一个java调用windows的压缩命令时遇到一奇怪问题代码如下: String cmd ="C:/Program Files (x86)/WinRAR/rar.exe a c:/t ...
- Spark(四十四):使用Java调用spark-submit.sh(支持 --deploy-mode client和cluster两种方式)并获取applicationId
之前也介绍过使用yarn api来submit spark任务,通过提交接口返回applicationId的用法,具体参考<Spark2.3(四十):如何使用java通过yarn api调度sp ...
- java调用cmd命令删除文件夹及其所有内容
/** * *删除D盘下面test目录,感觉以前用io流遍历删除好慢! * **/ public static void main(String[] args) { Runtime run = Run ...
- java 调用cmd命令
public class Port{ public static void main(String[] args) { Runtime runtime=Runtime.getRuntime(); tr ...
- Java调用windows命令
JAVA调用windows的cmd命令 用起来会让程序变得更加简洁明了,非常实用. 核心就是使用 Runtime类. cmd的xcopy就有很强大的文件夹,文件处理功能. 下面就以xcopy来说明,如 ...
随机推荐
- Game Engine Architecture 4
[Game Engine Architecture 4] 1.a model of multiple semi-independent flows of control simply matches ...
- Linux ansible 常用模块二
fetch 将远程机器上的文件拉取到本地,以ip或者主机名生成目录,并保留原来的目录结构 dest #目标地址src #源地址ansible web -m fetch -a "dest ...
- mybatis动态sql之foreach标签
foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量.它也允许你指定开头与结尾的字符串以及在迭代结果之间放置分隔符.这个元素是很 ...
- PhoenixFD插件流体模拟——UI布局【Foam】详解
流体泡沫 本文主要讲解Foam折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Foam 主要内容 Overview 综述 ...
- CodeWarrior 10 配置Jlint初始化文件
新建一个项目之后,飞思卡尔的仿真器的配置不如德州仪器那么简单.他需要一些配置. 当我们新建一个工程后,可以采取如下步骤配置Jlint: 1.右击工程名,选择属性. 2.在Run/Debug Setti ...
- vue data中调用图片的相对路径
直接将图片源文件放在项目目录的static文件夹里,然后和正常写图片路径那样写就可以了,不支持自定义的图片路径
- Linux-Centon7常用命令
查看本机IP # ip addr 进入目录 # cd /xxx/xxx 编辑文件,打开文件后,按“Insert”键,进入输入模式(最下面会显示INSERT),将ONBOOT选项改为yes,然后按“Es ...
- 分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式
一.用for循环实现 实验过程: 实验结果: 二.用while循环实现 实验结果: 三.用do while循环实现 实验结果: 四.用递归算法实现 实验结果: 实验心得: 此次实验中必须熟悉for循环 ...
- java使用ffmpeg实现上传视频的转码,提取视频的截图等功能
ffmpeg视频采集功能非常强大,不仅可以采集视频采集卡或USB摄像头的图像,还可以进行屏幕录制,同时还支持以RTP方式将视频流传送给支持RTSP的流媒体服务器,支持直播应用. 1.能支持的格式 ff ...
- dotnet run 提示System.Net.Sockets.SocketException (10049): 在其上下文中,该请求的地址无效。
更换端口号试一下. 查看官方文档 PS: 使用帮助命令 -h,可以指定启动配置文件: dotnet run --launch-profile xxx 例如下面的配置文件,假如我们要使用codes-t ...