最近在写一个自己的邮箱服务器里用到

监视及起/停 windows 中的服务,调查发现还是得用dos来做这些事情

说一下遭遇战的过程

首先是java里如何执行DOS命令,查到下记函数

Runtime.getRuntime().exec()

(到这你可以试着启动个 记事本 计算器的了Runtime.getRuntime().("notepad"); Runtime.getRuntime().("calc"); )

然后就是准备dos命令

服务启动   sc start "服务名"   

服务停止   sc start "服务名"

服务状态   sc query "服务名"

(引号必须)

然后是返回值的问题了 起/停 的命令执行后是有返回值的

还没发现比较好的对应方案 现在基本上就是把原本打印在 cmd框里的一行行输出出来自己判断

 private Map<String, String> executeCmd(String cmd) {
Runtime rt = Runtime.getRuntime(); // 运行时系统获取
Map<String, String> lineMap = new HashMap<String, String>();//存放返回值
try {
Process proc = rt.exec(cmd);// 执行命令
InputStream stderr = proc.getInputStream();//执行结果 得到进程的标准输出信息流
InputStreamReader isr = new InputStreamReader(stderr);//将字节流转化成字符流
BufferedReader br = new BufferedReader(isr);//将字符流以缓存的形式一行一行输出
String line = null;
while ((line = br.readLine()) != null) {
if (!StringUtils.isEmpty(line)) {
String[] strLine = line.split(":");
if(strLine.length>=2) {
lineMap.put(strLine[0].trim(), strLine[1].trim());
} }
}
br.close();
isr.close();
stderr.close();
} catch (IOException e) {
e.printStackTrace();
}
return lineMap;
}

ps: L11-17  根据不同的命令的执行结果不同 相应改变的 我这里得到的是  xx : yy 这样的所以这样处理

接下来就是 如是 bat 文件 怎么对处

同样的方法 把命令换成你的bat路径就好了 ,这个就不多说了想说一个关于权限的问题

bat文件的话 如果权限不够 通常会邮件bat文件以管理员身份运行 会这样的处理

但java里怎么处理?如下

 @echo off
mode con lines= cols=
% mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",)(window.close)&&exit
cd /d "%~dp0"
rem

之后再加上你要写的bat命令就好了

现在想想突然感觉很可怕有 admin 权限  也可以自己写cmd 创建 shell 执行 ...

还有一个就是 看当网上说 因执行命令过多或者执行内容过多 会造成Runtime阻塞问题,基本解决方案是多线程处理

就是把子进程的输出流(getInputStream)和错误流(getOutputStream)分给两个线程来做处理 如下

public class StreamManage extends Thread {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
InputStream inputStream;
String type;
public StreamManage(InputStream inputStream,String type) {
this.inputStream = inputStream;
this.type = type;
}
public void run () {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
try {
while((line = bufferedReader.readLine()) !=null ) {
if(type.equals("Error")) {
logger.error(line);
}else {
logger.debug(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

这里应该没什么要说的就是把把输出流穿过来做输出处理,然后调用的地方

L8,9

     private void startMailServer() {
String cmd = "sc start \"James 2.3.2.1\"";// dos 命令
Runtime rt = Runtime.getRuntime(); // 运行时系统获取
try {
// Process proc = rt.exec(cmd);// 执行命令
File filePath = new File("src\\main\\resources\\static\\bat\\runStart.bat");
Process proc = rt.exec(filePath.toString());
StreamManage errorStream = new StreamManage(proc.getErrorStream(), "Error");
StreamManage outputStream = new StreamManage(proc.getInputStream(), "Output");
errorStream.start();
outputStream.start();
} catch (IOException e) {
e.printStackTrace();
}
}

基本上就这些

最后说一个残留问题

就是 cmd窗口 闪屏的问题 如果执行的的是 命令 这个问题不存在 如果是 bat 不是要获取 admin 权限这个问题也没有  猜测 上记 获取权限的代码 造成了闪屏 调查中... 有知道的请告知

Java 执行CMD/DOS的更多相关文章

  1. java执行cmd命令并获取输出结果

    1.java执行cmd命令并获取输出结果 import java.io.BufferedReader; import java.io.InputStreamReader; import org.apa ...

  2. Windows使用Java执行cmd代码

    话不多说,直入正题 今天给大家分享下,怎么在Windows上使用Java执行Cmd代码! 首先默认大家都熟悉cmd代码,以及cmd的命令行操作. 直接在main方法中写这一行(需要抛出异常),可以直接 ...

  3. 如何使用Java执行cmd命令

    用JAVA代码实现执行CMD命令的方法! Runtime rt = Runtime.getRuntime(); Process p = rt.exec(String[] cmdarray);     ...

  4. java执行cmd命令和linux命令

    文章出处http://blog.csdn.net/xh16319/article/details/17302947 一:window下执行cmd指定 一:window下执行cmd指定 程序例子: [j ...

  5. Java执行cmd命令、bat脚本、linux命令,shell脚本等

    1.Windows下执行cmd命令 如复制 D:\tmp\my.txt 到D:\tmp\my_by_only_cmd.txt 现文件如图示: 执行代码: private static void run ...

  6. 解决方案--java执行cmd命令ProcessBuilder--出错Exception in thread "main" java.io.IOException: Cannot run program "dir d:\": CreateProcess error=2(xjl456852原创)

    当我尝试在java中通过ProcessBuilder运行window的cmd命令时出现错误: public static void main(String [] args) throws IOExce ...

  7. Java执行CMD命令

    参见:https://blog.csdn.net/lixingshi/article/details/50467840 public static void runtimeCommand() thro ...

  8. JAVA执行cmd命令方法

    package com.cmd; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStre ...

  9. java中执行cmd命令

    一.java执行cmd命令的三种方式:http://www.jb51.net/article/80829.htm 参考:https://www.cnblogs.com/zhufu9426/p/7928 ...

随机推荐

  1. win10 uwp 获取按钮鼠标左键按下

    我们可以使用PointerPressed获得鼠标右键按下,但是我们如何获得左键? 其实UWP已经没有MouseLeftButtonDown,于是我们可以使用一个简单方法去获取鼠标左键按下. 我们在xa ...

  2. python学习之第一课时--初始python

    Python前世今世 python是什么 python是一门多种用途的编程语言,时常在扮演脚本语言的角色 python流行原因 软件质量 提高开发者效率(python代码大小为C/java的1/3-1 ...

  3. UWP 手绘视频创作工具技术分享系列 - 手绘视频导出

    手绘视频最终的生成物是视频文件,前面几篇主要讲的是手绘视频的创作部分,今天讲一下手绘视频的导出问题.主要以 UWP 为例,另外会介绍一些 Web 端遇到的问题和解决方法. 如上所述,手绘视频在创作后, ...

  4. 【ASP.NET MVC 学习笔记】- 09 Area的使用

    本文参考:http://www.cnblogs.com/willick/p/3331519.html 1.ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,这对于大的工程非常有用, ...

  5. 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject

    本文参考:http://www.cnblogs.com/willick/p/3299077.html 1.在ASP.NET MVC中一个客户端请求是在特定的Controller的Action中处理的. ...

  6. JDBC连接池-C池3P0连接

    JDBC连接池-C3P0连接 c3p0连接池的学习英语好的看英文原版      c3p0 - JDBC3 Connection and Statement Pooling 使用c3p0连接池  三种方 ...

  7. ios 中的 GCD

    摘自:http://www.cocoachina.com/swift/20150129/11057.html libdispatch是Apple所提供的在IOS和OS X上进行并发编程的库,而GCD正 ...

  8. C语言(记录)——内存相关_2:内存的编址与管理

    本文是基于嵌入式的C语言 --------------------------------------------------------------------------------------- ...

  9. 一个比较实用的商业级图表Echarts

      了解了解                    ECharts,缩写来自Enterprise Charts,商业级数据图表,一个纯Javascript的图表库,可以流畅的运行在PC和移动设备上,兼 ...

  10. code forces 439 C. The Intriguing Obsession

    C. The Intriguing Obsession time limit per test 1 second memory limit per test 256 megabytes input s ...