当前位置: 移动技术网 > IT编程>开发语言>Java > JAVA:调用cmd指令(支持多次手工输入)

JAVA:调用cmd指令(支持多次手工输入)

2019年02月09日  | 移动技术网IT编程  | 我要评论

jdk开发环境:1.8

  1 package com.le.tool;
  2 
  3 import java.io.bufferedreader;
  4 import java.io.file;
  5 import java.io.ioexception;
  6 import java.io.inputstream;
  7 import java.io.inputstreamreader;
  8 import java.io.printwriter;
  9 import java.nio.charset.charset;
 10 
 11 /**
 12  * java调用cmd指令工具类
 13  * 
 14  * @author le.li
 15  * 
 16  */
 17 public class executeutil {
 18     /**
 19      * 避免乱码,如果没有传入语言编号,默认使用英文437<br>
 20      * d:\>chcp /? 显示或设置活动代码页编号。<br>
 21      * chcp [nnn]<br>
 22      * nnn 指定代码页编号。<br>
 23      * 不带参数键入 chcp 以显示活动代码页编号。<br>
 24      */
 25     private static final string default_language_code = "437";
 26 
 27     /**
 28      * window系统默认语言:gbk
 29      */
 30     private static final string default_language = "gbk";
 31 
 32     public static void main(string[] args) {
 33         // executelink();
 34         
 35         // executecmd("dir .");
 36         
 37         // 举例直接把bat文件当cmd指令调用
 38         string cmd = null;
 39         string filename = "test.bat";
 40         file f = new file(".");
 41         try {
 42             cmd = f.getcanonicalpath() + file.separator + filename;
 43         } catch (ioexception e) {
 44             // e.printstacktrace();
 45             system.err.println("get cmd file error.");
 46         }
 47         executecmd(cmd);
 48     }
 49 
 50     /**
 51      * 获取操作系统默认语言
 52      * 
 53      * @return string
 54      * @see java虚拟机启动默认的编码(一般和java文件设置格式一致)<br>
 55      *      system.out.println(charset.defaultcharset());<br>
 56      *      查看预置的变量信息:system.getproperties().list(system.out);<br>
 57      *      属性:<br>
 58      *      文件编码:file.encoding<br>
 59      *      系统默认编码sun.jnu.encoding
 60      */
 61     private static string getsystemlanguage() {
 62         return null == system.getproperty("sun.jnu.encoding") ? default_language
 63                 : system.getproperty("sun.jnu.encoding");
 64     }
 65 
 66     /**
 67      * 执行cmd指令
 68      * @param cmd 执行指令
 69      */
 70     public static void executecmd(string cmd) {
 71         executelink(default_language_code, true, cmd);
 72     }
 73 
 74     /**
 75      * cmd手工输入交互处理窗口
 76      */
 77     public static void executelink() {
 78         executelink(default_language_code, false, "");
 79     }
 80 
 81     /**
 82      * cmd交互处理窗口
 83      * 
 84      * @param languagecode 系统语言编码
 85      * @param isonerun 只执行cmd指令
 86      * @param cmd 执行的指令
 87      * @see 在中文windows系统中,根据编码需要设置编码 chcp 65001 就是换成utf-8代码页<br>
 88      *      chcp 936 可以换回默认的gbk<br>
 89      *      chcp 437 是美国英语 <br>
 90      */
 91     public static void executelink(string languagecode, boolean isonerun, string cmd) {
 92         try {
 93             string cmdbin = "cmd";
 94             if (isonerun) {
 95                 cmdbin = "cmd /c ";
 96             }
 97             process process = runtime.getruntime().exec(cmdbin + cmd);
 98             printwriter writer = new printwriter(process.getoutputstream());
 99             if (!isonerun) {
100                  // 此处可以预置交互指令
101                  // writer.println("chcp " + languagecode);
102                  writer.println("echo hello world.");
103                  writer.flush();
104             }
105             commandthread commandthread = new commandthread(writer);
106             commandthread.setname("executecmdthread");
107             commandthread.start();
108             processinputstreamthread inputthread = new processinputstreamthread(process.getinputstream());
109             processinputstreamthread errorthread = new processinputstreamthread(process.geterrorstream());
110             inputthread.setname("inputstreamthread");
111             inputthread.start();
112             errorthread.setname("errorstreamthread");
113             errorthread.start();
114             // 即使添加下边的一句也不会使线程结束
115             // thread.currentthread().interrupt();
116         } catch (exception e) {
117             e.printstacktrace();
118         }
119     }
120 
121     static class commandthread extends thread {
122         printwriter writer;
123         bufferedreader br = null;
124 
125         commandthread(printwriter writer) {
126             this.writer = writer;
127             // 避免出现乱码问题,直接使用系统默认的编码格式
128             br = new bufferedreader(new inputstreamreader(system.in, charset.forname(getsystemlanguage())));
129             this.setdaemon(true);
130         }
131 
132         @override
133         public void run() {
134             try {
135                 string cmd = null;
136                 while ((cmd = br.readline()) != null) {
137                     writer.println(cmd);
138                     writer.flush();
139                 }
140             } catch (ioexception e) {
141                 e.printstacktrace();
142             } finally {
143                 if (null != writer) {
144                     writer.close();
145                 }
146                 if (null != br) {
147                     try {
148                         br.close();
149                     } catch (ioexception e) {
150                         // todo auto-generated catch block
151                         e.printstacktrace();
152                     }
153                 }
154             }
155         }
156     }
157 
158     static class processinputstreamthread extends thread {
159 
160         inputstream input;
161         bufferedreader breader = null;
162 
163         processinputstreamthread(inputstream input) {
164             this.input = input;
165             // 避免出现乱码问题,直接使用系统默认的编码格式
166             breader = new bufferedreader(new inputstreamreader(input, charset.forname(getsystemlanguage())));
167         }
168 
169         @override
170         public void run() {
171             try {
172                 string str = null;
173                 while ((str = breader.readline()) != null) {
174                     system.out.println(str);
175                 }
176             } catch (ioexception e) {
177                 e.printstacktrace();
178             } finally {
179                 if (null != input) {
180                     try {
181                         input.close();
182                     } catch (ioexception e) {
183                         // todo auto-generated catch block
184                         e.printstacktrace();
185                     }
186                 }
187                 if (null != breader) {
188                     try {
189                         breader.close();
190                     } catch (ioexception e) {
191                         // todo auto-generated catch block
192                         e.printstacktrace();
193                     }
194                 }
195             }
196         }
197     }
198 }

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网