在本文中,我们将介绍Java开发人员的常见需求。 从Java内部执行和管理外部流程。 由于这项任务很常见,因此我们着手寻找一个Java库来帮助我们完成它。

该库的要求是:

  • 异步执行该过程。
  • 能够中止流程执行。
  • 等待流程完成的能力。
  • 处理中的输出通知。
  • 能够在进程挂起时终止进程。
  • 获取流程退出代码。

本地JDK并没有太大帮助。 幸运的是,我们有Apache Commons Exec 。 确实,这要容易得多,但仍不如我们希望的那样简单。 我们在上面写了一个小包装纸。

这是我们公开的方法签名:

1: public static Future<Long> runProcess(final CommandLine commandline, final ProcessExecutorHandler handler, final long watchdogTimeout) throws IOException;
  1. 它返回一个Future <Long>。 这涵盖了第1,2,3,6节。
  2. ProcessExecutorHandler的实例传递给该函数。 该实例实际上是任何进程输出的侦听器。 这涵盖了我们要求中的第4节。
  3. 最后但并非最不重要的一点是您要提供超时。 如果进程执行所花的时间超过了上述超时时间,则假定进程已挂起,然后将其终止。 在这种情况下,进程返回的错误代码将为-999。

而已! 这是方法植入。 请享用。

import org.apache.commons.exec.*;import org.apache.commons.exec.Executor;import java.io.IOException;import java.util.concurrent.*;public class ProcessExecutor {public static final Long  WATCHDOG_EXIST_VALUE = -999L;public static Future<Long> runProcess(final CommandLine commandline, final ProcessExecutorHandler handler, final long watchdogTimeout) throws IOException{ExecutorService executor = Executors.newSingleThreadExecutor();return executor.submit(new ProcessCallable(watchdogTimeout, handler, commandline));}private static class ProcessCallable implements Callable<Long>{private long watchdogTimeout;private ProcessExecutorHandler handler;private CommandLine commandline;private ProcessCallable(long watchdogTimeout, ProcessExecutorHandler handler, CommandLine commandline) {this.watchdogTimeout = watchdogTimeout;this.handler = handler;this.commandline = commandline;}@Overridepublic Long call() throws Exception {Executor executor = new DefaultExecutor();executor.setProcessDestroyer(new ShutdownHookProcessDestroyer());ExecuteWatchdog watchDog = new ExecuteWatchdog(watchdogTimeout);executor.setWatchdog(watchDog);executor.setStreamHandler(new PumpStreamHandler(new MyLogOutputStream(handler, true),new MyLogOutputStream(handler, false)));Long exitValue;try {exitValue =  new Long(executor.execute(commandline));} catch (ExecuteException e) {exitValue =  new Long(e.getExitValue());}if(watchDog.killedProcess()){exitValue =WATCHDOG_EXIST_VALUE;}return exitValue;}}private static class MyLogOutputStream extends  LogOutputStream{private ProcessExecutorHandler handler;private boolean forewordToStandardOutput;private MyLogOutputStream(ProcessExecutorHandler handler, boolean forewordToStandardOutput) {this.handler = handler;this.forewordToStandardOutput = forewordToStandardOutput;}@Overrideprotected void processLine(String line, int level) {if (forewordToStandardOutput){handler.onStandardOutput(line);}else{handler.onStandardError(line);}}}public static void main(String[] args) throws IOException {CommandLine cl = CommandLine.parse("test.bat");Future<Long> exitValue = runProcess(cl, new ProcessExecutorHandler() {@Overridepublic void onStandardOutput(String msg) {System.out.println("output msg = " + msg);}@Overridepublic void onStandardError(String msg) {System.out.println("error msg = " + msg);}}, 1);try {Long aVoid = exitValue.get();System.out.println("Finished with  " + aVoid);} catch (InterruptedException e) {e.printStackTrace();  //To change body of catch statement use File | ngs | File Templates.} catch (ExecutionException e) {e.printStackTrace();  //To change body of catch statement use File | ngs | File Templates.}}}

参考:在DeveloperLife博客上,从我们的JCG合作伙伴 Nadav Azaria 执行可从Java执行的命令行 。

翻译自: https://www.javacodegeeks.com/2013/01/executing-a-command-line-executable-from-java.html

从Java执行可执行的命令行相关推荐

  1. cmd执行服务器sql文件命令行,Dos命令提示符下 - 用sqlcmd执行*.sql语句

    Dos命令提示符下 - 用sqlcmd执行*.sql语句 1)在Dos命令下执行sqlcmd命令(当然事先需要将sqlcmd增加到环境变量中去), 2)下面白色部分替换为服务器名或计算机名即可 sql ...

  2. python执行脚本时的命令行选项_Python 处理脚本的命令行参数(二):使用click

    安装click pip install click 使用步骤 使用@click.command() 装饰一个函数,使之成为命令行接口 使用@click.option() 等装饰函数,为其添加命令行选项 ...

  3. mysql命令 执行存储过程_mysql使用命令行执行存储过程

    编写存储过程sql 以给brand表添加phone字段为例: DROP PROCEDURE IF EXISTS UpdateColum; CREATE PROCEDURE UpdateColum() ...

  4. python执行cmd命令行异步执行_Python 异步调用命令行工具

    当你在自己的 Python 程序中采用了基于事件循环的异步编程方法之后,你就会发现自己不自觉地被其牢牢吸引住,并不是说这一方法多么棒,而是因为你不得不想办法保证程序中的任意环节都不能是阻塞的! 例如当 ...

  5. linux命令行执行mysql语句_linux命令行中直接执行mysql语句

    其实我一开始是拒绝的,但是貌似就得这么做.怎么一行一行的来?没法整了. 有两种方法可以在命令行下执行sql命令.第一种是使用"-e"参数来指定需要执行的sql语句:第二种是通过管道 ...

  6. java内存溢出排查jstack_Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)

    项目部署上线之后,线上项目是不能轻易修改的,定位问题的难度也会变大.因此监控是非常重要的一个环节,有了监控,我们才能更好的定位系统中的问题,从而排查.监控的工具有很多种, 但是java自带的命令行监控 ...

  7. java运行class文件_java命令行下运行class文件

    今天碰到了一个很变态的问题,写了一个很简单的HelloWord.java,内容如下: package com.yanjiuyanjiu; public class HelloWorld { publi ...

  8. android java调用参数,如何从命令行调用Android JNI函数并传递Java对象参数

    一.前言 当我们对某个使用原生库(native library)的恶意软件或者应用进行分析或渗透测试时,如果能够对库函数进行隔离和执行是再好不过的事情,这样做我们就可以使用其自身的代码来调试对抗恶意软 ...

  9. java 引用 jar包_java命令行引用jar包的方法

    java命令行引用jar包的方法 java命令行怎么引用jar包?jar包有哪些常用方法?下面跟yjbys小编一起来学习一下,希望对大家学习java语言有帮助! 一般情况下: 如果java 文件和ja ...

  10. Java人机猜拳游戏(命令行版)

    这是本学期的java作业: java编写一个人机对战的猜拳小游戏.人选择性出拳,电脑随机出拳,判断输赢,记录输赢情况.有简单的操作界面. 学了一个学期的Java,感觉收获还挺多的.第一次用Java写小 ...

最新文章

  1. 新年新气象,2008年是我创业关键的一年!
  2. JAVA数据库连接的另一种实现及简单的数据插入及显示
  3. dvi黑屏解决方法_赛博朋克2077黑梦黑屏怎么办 黑梦BUG全黑模式解决方法
  4. 数据结构:链式基数排序,通俗易懂!
  5. Django(part51)--自定义User模型
  6. PyTorch 之 requires_grad,requires_grad_(),grad_fn
  7. 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序
  8. java社区活跃度_Java并发编程-活跃度问题
  9. leetcode —— 752. 打开转盘锁
  10. svn 导入的 web项目怎么变成了java项目了
  11. html vba 单元格 格式,VBA设置单元格格式之——边框
  12. CS231n:作业1——KNN
  13. 硬件开发过程简介(一)
  14. orbslam2 流程图_一种基于ORBSLAM2的八叉树建图方法与流程
  15. 改进网易云音乐的“音乐社交”构想
  16. DEDE网站安全设置防挂马教程
  17. IntelliJ IDEA 2016.2 注册破解激活教程
  18. 在鹅厂工作的广西表妹教我用Python生成会跳舞的美女~
  19. 01.自我意识的觉醒
  20. python程序填空_pygame实现成语填空游戏

热门文章

  1. (转)使用IDEA将普通MAVEN项目转为WEB项目
  2. MySQL创建字段+数据处理函数+汇总数据(聚集函数)+分组数据
  3. javafx 遮罩_JavaFX技巧31:遮罩/剪切/ Alpha通道
  4. java中使用jython_将Jython嵌入到您的Java代码库中
  5. 戴尔集群监控与管理系统_监控与管理
  6. unwind neo4j_Neo4j 2.1:传递节点ID与UNWIND
  7. Spring Security with Spring Boot 2.0:密码编码器
  8. Java 9:JShell
  9. primefaces_轻量级Web应用程序框架:PrimeFaces(JSF)+ Guice + MyBatis(第2部分)
  10. java 修改 枚举类字段_枚举枚举和修改“最终静态”字段的方法