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 }
下一篇: 第84节:Java中的网络编程(中)