- 浏览: 375276 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (107)
- Linux (2)
- WebService (4)
- Java基础 (18)
- 优秀博客文章 (6)
- 面试 (2)
- 视频 (1)
- 开源软件 (7)
- DOS命令、批处理 (2)
- SSH Mybatis (11)
- MQ (3)
- 个人开发者 (1)
- 设计模式 (2)
- 博客 (1)
- 缓存 (1)
- 数据库 (10)
- 工具软件 (9)
- Tomcat (3)
- 网络 (2)
- XML 、JSON (1)
- OSGI (1)
- 算法 (1)
- 计算机基础、网络 (1)
- Web 开发 (3)
- 程序人生 (1)
- Servlet基础 (1)
- 英语 (1)
- 临时、未分类 (4)
- 网路、word使用技巧 (2)
- Java性能优化 (0)
最新评论
-
360pluse:
使用apache ActiveMQ深入企业级程序设计网盘地址: ...
Active MQ技术文章(JMS) -
星辰海:
问下,像TimerTask一旦抛异常,就永远不执行了,这种情况 ...
spring学习系列 -- 定时器三 两种定时器的比较 -
360pluse:
使用apache ActiveMQ深入企业级程序设计百度网盘: ...
Active MQ技术文章(JMS) -
xj56ai:
能不能 提供一下 包
Spring 学习系列 -- Spring + Mybatis 从零开始配置多数据源访问 -
wejack639:
写的很好,很有用,谢谢
spring学习系列 -- 定时器三 两种定时器的比较
Demo
涉及到执行外部函数时的环境变量
使用LineNumberReader处理执行结果
import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.Iterator; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.dahuazwan.backup.pojo.BackupPojo; public class Backup { private static Log log = LogFactory.getLog(Backup.class); /** * * @param backupPojo * @param iAllback true:备份全部;否则备份指定表 */ public void execute(BackupPojo backupPojo,boolean iAllback){ ProcessBuilder pb = new ProcessBuilder("cmd","/c",backupPojo.toBackupSql(iAllback)); // 设置环境变量 Map<String, String> env = pb.environment(); // 设置新的环境变量 String sMysqlbindir = backupPojo.getsMysqlbindir(); if(sMysqlbindir != null && !"".equals(sMysqlbindir)){ this.changeEnv(env, "path", backupPojo.getsMysqlbindir(), false); } // // 打印 // Iterator<String> it = env.keySet().iterator(); // while(it.hasNext()){ // String key = it.next(); // System.out.println(key + " = " + env.get(key)); // // } Iterator<String> it = env.keySet().iterator(); while(it.hasNext()){ String key = it.next(); System.out.println(key + " = " + env.get(key)); } // pb.directory(); try { Process p = pb.start(); //打印错误流信息 LineNumberReader lnr = new LineNumberReader(new InputStreamReader(p.getErrorStream())); String s; while( (s = lnr.readLine()) != null){ // 打印错误信息 log.error(s); } // 如果行号为0,则无错误信息,执行命令成功,否则失败 if(lnr.getLineNumber() == 0){ log.info(" back up database ok !"); }else{ log.info(" back up database failure ! cmd = \" " + backupPojo.toBackupSql(iAllback) + "\"") ; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); log.info(" back up database failure ! cmd = \" " + backupPojo.toBackupSql(iAllback) + "\"") ; log.error(e); } } /** * * @param sName 非空 * @param sValue * @param isAppend true:append:false:替换 */ public void changeEnv(Map<String, String> env,String sName,String sValue, boolean isAppend ){ // 全部小写 Iterator<String> it = env.keySet().iterator(); while(it.hasNext()){ String sKey = it.next(); if(sName.equalsIgnoreCase(sKey)){ if(isAppend){ // append String sT = env.get(sKey); if(sT == null || "".equals(sT)){ sT = sValue; }else{ sT = sT + ";" + sValue; } env.put(sKey, sT); }else{ //替换 env.put(sKey, sValue); } } } } }
Demo 2:
比第一个好:
public class DosRun { private static Log log = LogFactory.getLog(DosRun.class); /** * 执行外部程序,此程序无输入流 * @param sCommand */ public static void execute(List<String> lCommand){ try{ if(log.isInfoEnabled()){ log.info("Command = " + lCommand); } ProcessBuilder pb = new ProcessBuilder(lCommand); pb.redirectErrorStream(true); //错误和正确信息合并输出 Process p = pb.start(); p.getOutputStream().close(); //关不输出 // 打印处理消息 String sInfo = readInputStream(p.getInputStream()); log.info("Info = " + sInfo); int iResult = p.exitValue(); if(iResult == 0){ log.info(" result = " +p.exitValue() + "execute command success! Command = " + lCommand); }else{ log.info(" result = " +p.exitValue() + "execute command failure! Command = " + lCommand); } }catch(Exception e){ throw new RuntimeException(e); } } /** * 执行程序,该程序由输入流 * @param lCommand * @param sFile 成员要接收的数据文件 */ public static void execute(List<String> lCommand, String sFile){ try{ if(log.isInfoEnabled()){ log.info("Command = " + lCommand); } ProcessBuilder pb = new ProcessBuilder(lCommand); pb.redirectErrorStream(true); //错误和正确信息合并输出 Process p = pb.start(); FileInputStream fis = new FileInputStream(sFile); OutputStream os = p.getOutputStream(); byte[] b = new byte[8192]; int num = 0; while((num = fis.read(b) )!= -1){ os.write(b,0,num); } os.close(); // 打印处理消息 String sInfo = readInputStream(p.getInputStream()); log.info("Info = " + sInfo); int iResult = p.exitValue(); if(iResult == 0){ log.info(" result = " +p.exitValue() + "execute command success! Command = " + lCommand); }else{ log.info(" result = " +p.exitValue() + "execute command failure! Command = " + lCommand); } }catch(Exception e){ throw new RuntimeException(e); } } /** * 读取流中数据,并返回给用户 * @return * @throws IOException */ private static String readInputStream(InputStream in) throws IOException{ StringBuilder sb = new StringBuilder(); LineNumberReader lnr = new LineNumberReader(new InputStreamReader(in)); String s; while( (s = lnr.readLine()) != null){ // 打印信息 System.out.println(s); sb.append(s).append("\r\n"); } return sb.toString(); } }
参考文献
- [java调用外部可执行程序] 2. java输入输出重定向 取得Runtime.getRuntime().exec("cmd /c dir")的输入输出; 利用ProcessBuilder来创建Process对象,执行外部可执行程序;如何协调外部进程与当前Java进程(waitFor方法和执行DOS的内部命令)
- Java调用外部程序命令 阅读ProcessBuilder源代码后对List参数的空格处理说明;将标准输出和错误输出合并,一起读出来或者在另外的线程中读出来;如果不使用标准输入,建议close
- 使用ProcessBuilder执行本地命令 Demo
发表评论
-
Java研究 -- Jdk获取本地计算机名称的一个Bug
2012-08-31 14:15 3240通过Java1.6的jdk获取中文计算机名称时,存在一 ... -
java基础 -- java自带exe
2012-08-29 08:33 937Java.exe 执行类: java ... -
java基础 -- IO、NIO
2012-08-25 09:32 764IO参考文献 NIO参考文献 ... -
java基础 -- 乱码
2012-08-24 13:55 777BufferedReader读取utf-8文件(html ... -
java基础 -- 注释
2012-08-24 13:37 753参考文献 J2SE5中的最新注 ... -
Swing学习系列 -- Swing读书笔记目录
2012-07-28 14:54 1166为了便于二次查找,学习,特列出Swing的目录如下 ... -
Java核心多线程 -- 消费者生产者Demo一
2012-07-28 13:11 1753目的 实现1个生产者和多个消费者合作工作的模式 手段 ... -
Java技术文章
2012-07-03 22:21 1067java虚拟机 java.lang.OutOf ... -
Java正则表达式
2012-06-21 13:27 1206参考文献: 1. 大名鼎鼎的《正则表达式3 ... -
Java基础内容技术文章
2012-06-19 13:54 915内存、引用 浅析Java的“克 ... -
Tomcat 加载jar包的顺序
2012-06-16 12:45 13726实验目的 2个jar包中,各有一个类名完全相同 ... -
Java内存的技术文章
2012-06-07 18:43 881java.lang.OutOf ... -
java打包成exe
2012-05-30 13:36 1074目录结构 jar -- config 配置文件 ... -
Java关键字
2012-05-23 22:20 771transient 变量 ... -
枚举学习
2012-05-01 13:34 9971 枚举的应用 存储每周中的天份 /** * 枚举的应 ... -
Beanutil应用
2012-05-01 00:08 16100 包 org.apache.commons.beanut ... -
Java性能
2012-04-30 02:04 1020Java编程中“为了性能 ...
相关推荐
有关java怎样调用外部文件的,可以是exe,也可以是chm等
通过java应用程序动态调用外部jar文件。
F:\Work\Study\功能点技术\java调用可执行文件\Java调用外部程序命令.doc
java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。
对向前兼容性的推荐 :如果想要动态地创造Transformation (例如:从元数据),使用XML文件方法(KTR)而不是使用API。 XML文件兼容Kettle所有版本,同样对job有效的。 下面的例子进行以下操作: 1创建Transformation ...
1、封装WeatherInfo实体类,对接口返回的结果进行映射的实体类 2、WeatherUtils类,负责调用第三方天气预报api接口处理的工具类,包括根据城市查询等,返回的格式是json 3、test类,对接口进行功能性测试
java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长。主要参考http://blog.sina.com.cn/s/blog_a5116c670102wiwj.html 的代码方式。步骤: 1.研究java如何调用外部程序 2.研究ffmpeg转换视频格式的...
MATLAB的最新版本2006b中新添了一个产品-MATLAB Builder for Java。其实本来Matlab就有Java外部程序接口,不过原来的接口只能在.m文件中调用Java,而无法在Java程序中调用Matlab。
本例子是通过httpClient 不断的去电信的网站查询可选手机新号 , 每次查出来的数据保存到map , 到一定数量以后 , 保存在本地文件中 , 测试类可以直接运行.Java工程,Maven实现
项目中,经常把一部分功能独立出来,做一个java project,然后打成jar包供其他项目引用...这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采用jar包读取外部配置文件。
本代码主要开源了java报表工具中报表调用部分的代码,通过该开源代码,你可以了解报表工具的内部原理,掌握国内主流java报表工具的各类接口使用方法,并运用该接口对软件产品或项目中的个性化的需求进行二次开发。...
JAVA动态加载JAR文件以及反射调用其方法
下面小编就为大家带来一篇java调用7zip解压压缩包的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...
主要介绍了实例展示使用Java压缩和解压缩7z文件的方法,用到了7-zip的开源项目7-zip-JBinding,需要的朋友可以参考下
HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...
Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...
SpringBoot(32) 整合Forest实现调用第三方接口
你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...
该文件夹下project文件可用eclipse for java 直接打开编译。编译是需要注意的是将java-mysql的类库放置在C:\Program Files\Java\jre6\lib\ext路径下。本程序只用到这一个Java外部类库。 在源文件中,DataReceiver....