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

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 }

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

时间: 2024-10-30 11:11:17

JAVA:调用cmd指令(支持多次手工输入)的相关文章

Java调用cmd命令 打开一个站点

使用Java程序打开一个站点 近期做了个东西使用SWT技术在一个client程序 须要升级时在提示升级 点击窗口上的一个连接 打开下载网页 花费了我非常长时间 用到了把它记录下来  怕是忘记,须要时能够直接来用到.         try { //不是在Java程序中运行而是在操作系统中运行             Runtime.getRuntime().exec("cmd /c start http://blog.csdn.net/blogluoqi/"); //Runtime.g

java调用cmd执行maven命令

一.原理介绍 Java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后封闭命令窗口. cmd /k dir 是执行完dir命令后不封闭命令窗口. cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会封闭. cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会封闭. 可以用cmd / 查看帮助信息. 二.java调用cmd执行maven package命

转:Java调用CMD命令

java的Runtime.getRuntime().exec(commandStr)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完dir命令后不关闭命令窗口. cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭. cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭. 可以用cmd /?查看帮助信息. ★CMD命令★ 1. gpedit.msc-----组策略 2. s

Java 调用cmd.exe命令

转自:http://blog.163.com/[email protected]/blog/static/1406291232012575743301/ java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令 cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完dir命令后不关闭命令窗口. cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭. cmd /k start dir

JAVA调用CMD命令

原理:java的Runtime.getRuntime().exec(commandText)可以调用执行cmd指令. cmd /c dir 是执行完dir命令后关闭命令窗口. cmd /k dir 是执行完dir命令后不关闭命令窗口. cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭. cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭. 注:增加了start,就会打开新窗口,可以用cmd /?查看帮助信息. 如下举例: 1.从D盘

java调用cmd

没有太多需要说的, IO部分掌握的不好啊,期间遇到了乱码问题......这里要mark一下,有时间一定要搞定它. 下面直接上代码: package RuntimeTest.RuntimeTest; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOExcepti

Java通过jni技术支持c、c++调用使用整理

最近在公司搞终端5.0,说要对c++版本sdk封装一个java版的sdk,可是团队没有搞java的,于是赶鸭子上架,临时学习几天,整了一下:感觉还挺有意思的,于是整理一下: 为什么要使用java支持对c.c++的调用? 众所周知Java语言是一门支持跨平台解释型语言:#.java通过javac编译生成生成#.class字节码,运行过程依赖java虚拟机执行字节码生成虚拟机的执行指令,最终通过虚拟机操控所在平台,完成其设计的功能:其优点很明显,支持跨平台:其缺点也很明显,执行效率底,并且不支持平台

JAVA中调用CMD命令,并输出执行结果

package com.wzw.util; import java.io.BufferedReader; import java.io.InputStreamReader; public class CmdDemo { public static void main(String[] args) { BufferedReader br = null; try { Process p = Runtime.getRuntime().exec("net user"); br = new Bu

java打开本地应用程序(调用cmd)

有时候我们需要借助java程序打开电脑自带的一些程序,可以直接打开或者借助cmd命令窗口打开一些常用的应用程序.例如: package cn.xm.exam.test; import java.io.IOException; import org.junit.Test; public class TestCmd { @Test public void test1() throws IOException { // 直接打开应用程序 Runtime.getRuntime().exec("C:/Us