- 浏览: 379932 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 3281通过Java1.6的jdk获取中文计算机名称时,存在一 ... -
java基础 -- java自带exe
2012-08-29 08:33 966Java.exe 执行类: java ... -
java基础 -- IO、NIO
2012-08-25 09:32 794IO参考文献 NIO参考文献 ... -
java基础 -- 乱码
2012-08-24 13:55 831BufferedReader读取utf-8文件(html ... -
java基础 -- 注释
2012-08-24 13:37 780参考文献 J2SE5中的最新注 ... -
Swing学习系列 -- Swing读书笔记目录
2012-07-28 14:54 1204为了便于二次查找,学习,特列出Swing的目录如下 ... -
Java核心多线程 -- 消费者生产者Demo一
2012-07-28 13:11 1781目的 实现1个生产者和多个消费者合作工作的模式 手段 ... -
Java技术文章
2012-07-03 22:21 1100java虚拟机 java.lang.OutOf ... -
Java正则表达式
2012-06-21 13:27 1228参考文献: 1. 大名鼎鼎的《正则表达式3 ... -
Java基础内容技术文章
2012-06-19 13:54 954内存、引用 浅析Java的“克 ... -
Tomcat 加载jar包的顺序
2012-06-16 12:45 13827实验目的 2个jar包中,各有一个类名完全相同 ... -
Java内存的技术文章
2012-06-07 18:43 904java.lang.OutOf ... -
java打包成exe
2012-05-30 13:36 1107目录结构 jar -- config 配置文件 ... -
Java关键字
2012-05-23 22:20 797transient 变量 ... -
枚举学习
2012-05-01 13:34 10271 枚举的应用 存储每周中的天份 /** * 枚举的应 ... -
Beanutil应用
2012-05-01 00:08 16380 包 org.apache.commons.beanut ... -
Java性能
2012-04-30 02:04 1070Java编程中“为了性能 ...
相关推荐
在Java编程语言中,调用外部文件是一项基本且重要的任务,无论是执行可执行程序(如.exe),还是查看帮助文档(如.chm)。本篇将详细阐述如何在Java中实现这些功能。 首先,让我们关注如何调用外部的.exe文件。在...
总结来说,Java调用外部jar文件涉及以下几个关键点: 1. 理解Java类加载机制,包括系统类加载器和自定义类加载器。 2. 创建自定义类加载器,重写`findClass()`方法,从jar文件中读取并加载类。 3. 使用加载的类进行...
本文将深入探讨如何使用Java调用BAT文件,以及在这个过程中可能遇到的问题和解决方案。 首先,理解基本原理:Java通过`Runtime.getRuntime().exec()`方法来执行外部命令,这包括运行批处理文件。这个方法允许Java...
Java 中两种方式调用其他.exe 可执行程序 Java 是一种广泛应用于企业级应用开发的编程语言,可以调用其他.exe 可执行程序,实现一些特殊的功能。在 Java 中有两种方式可以调用其他.exe 可执行程序,即使用 `Desktop...
本文将详细介绍如何在Java中调用本地exe文件,并解析提供的代码示例。 ### 一、Java中调用本地exe文件的基本原理 #### 1.1 调用本地exe文件的方式 在Java中,可以通过`java.lang.Runtime`类或者`java.lang....
本文将详细讲解如何使用Java调用外部程序以及如何捕获并处理程序的输出。 首先,`Runtime.getRuntime().exec()`方法是Java中最基础的调用外部程序的方式。它允许我们执行系统命令,并返回一个`Process`对象,通过该...
java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。
综上所述,Java调用Windows可执行文件是一个常见的需求,可以通过Runtime或ProcessBuilder类实现。理解并正确使用这些功能,可以帮助开发者实现更复杂的跨平台集成需求。在具体应用中,应考虑安全性、错误处理和资源...
这篇博文“用java 调用外部程序”可能详细介绍了如何在Java环境中实现这一功能。虽然描述部分为空,但我们可以基于这个主题展开讨论。 在Java中,调用外部程序的主要方法是使用`Runtime`类或`ProcessBuilder`类。`...
首先,我们需要理解Java调用外部程序的基本原理。在Java中,我们可以使用`Runtime`类或`ProcessBuilder`类来执行操作系统级别的命令,例如运行bat文件。以下是一个简单的示例,展示如何使用`Runtime.getRuntime()....
`SurferUtil.java`是Java源代码文件,这是Java调用VB开发的Surfer功能的关键部分。在Java中,通常采用`ProcessBuilder`或`Runtime.exec()`方法来执行外部命令(即`sufercounter.exe`)。同时,为了传递参数和接收...
在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...
在Java编程中,有时我们需要与操作系统进行交互,例如调用已存在的Windows系统下的.exe可执行文件。这在处理一些特定的任务,如自动化脚本、数据分析或者其他需要借助外部工具完成的功能时非常常见。本文将深入探讨...
Sybase数据库系统,作为一款企业级的关系型数据库管理系统,提供了与Java语言的集成,使得开发人员可以在存储过程中调用外部Java程序,这对于无需依赖系统服务器进行定时任务调度的情况尤其有用。本文将详细介绍如何...
在Java编程中,通过URL调用接口是一种常见的网络通信方式,尤其在Web服务和API交互中扮演着重要角色。这个项目提供了一种方法,通过URL发送请求并接收响应,然后将响应的字符串转换为JSON格式进行处理。接下来,我们...
Java调用Kettle代码主要涉及两个关键点:Java编程与Kettle(Pentaho Data Integration,简称PDI)工具的集成。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于数据抽取、转换和加载。Java作为广泛应用...
在IT行业中,调用外部服务来增强应用功能是一种常见的做法,比如使用有道翻译API来实现文本翻译。本文将详细讲解如何在Java环境下调用有道翻译API,以实现高效、便捷的多语言翻译功能。 首先,有道翻译API提供了一...
批处理文件通常包含一系列的DOS命令,通过Java调用这些文件可以执行更复杂的操作。以下是示例代码: ```java public class BatchFileRunner { public static void main(String[] args) { try { String ...
Kettle API 是一个强大的工具,允许开发者通过Java代码与Pentaho Data Integration (Kettle) 进行交互,实现数据提取、转换和加载(ETL)过程的自动化。在给定的示例中,主要展示了如何使用Kettle API 创建、保存和...