码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-02-09 10:45:58      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:.bat   file   while   操作系统   enc   指定   ==   out   str   

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 }

 

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

标签:.bat   file   while   操作系统   enc   指定   ==   out   str   

原文地址:https://www.cnblogs.com/leonlipfsj/p/10357032.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!