欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-21 10:35:33
JDK开发环境:1.8 ......

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 }