`

Java调用外部文件

 
阅读更多

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调用外部文件

    在Java编程语言中,调用外部文件是一项基本且重要的任务,无论是执行可执行程序(如.exe),还是查看帮助文档(如.chm)。本篇将详细阐述如何在Java中实现这些功能。 首先,让我们关注如何调用外部的.exe文件。在...

    java调用外部jar文件

    总结来说,Java调用外部jar文件涉及以下几个关键点: 1. 理解Java类加载机制,包括系统类加载器和自定义类加载器。 2. 创建自定义类加载器,重写`findClass()`方法,从jar文件中读取并加载类。 3. 使用加载的类进行...

    java调用bat文件

    本文将深入探讨如何使用Java调用BAT文件,以及在这个过程中可能遇到的问题和解决方案。 首先,理解基本原理:Java通过`Runtime.getRuntime().exec()`方法来执行外部命令,这包括运行批处理文件。这个方法允许Java...

    java中两种方式调用其他.exe可执行程序

    Java 中两种方式调用其他.exe 可执行程序 Java 是一种广泛应用于企业级应用开发的编程语言,可以调用其他.exe 可执行程序,实现一些特殊的功能。在 Java 中有两种方式可以调用其他.exe 可执行程序,即使用 `Desktop...

    java中调用本地exe文件

    本文将详细介绍如何在Java中调用本地exe文件,并解析提供的代码示例。 ### 一、Java中调用本地exe文件的基本原理 #### 1.1 调用本地exe文件的方式 在Java中,可以通过`java.lang.Runtime`类或者`java.lang....

    用JAVA调用外部程序并截出程序运行结果

    本文将详细讲解如何使用Java调用外部程序以及如何捕获并处理程序的输出。 首先,`Runtime.getRuntime().exec()`方法是Java中最基础的调用外部程序的方式。它允许我们执行系统命令,并返回一个`Process`对象,通过该...

    java执行linux命令,java调用linux脚本文件,java启动停止发布tomcat,servlet ajax文件上传

    java 执行linux命令源码,java调用shell脚本源码,java web发布war到tomcat,servlet文件上传,ajax文件上传。 java web 上传war包、停止、启动、发布tomcat。 命令修改成自己的目录即可使用。

    java 调用windows的一些可执行文件

    综上所述,Java调用Windows可执行文件是一个常见的需求,可以通过Runtime或ProcessBuilder类实现。理解并正确使用这些功能,可以帮助开发者实现更复杂的跨平台集成需求。在具体应用中,应考虑安全性、错误处理和资源...

    用java 调用外部程序

    这篇博文“用java 调用外部程序”可能详细介绍了如何在Java环境中实现这一功能。虽然描述部分为空,但我们可以基于这个主题展开讨论。 在Java中,调用外部程序的主要方法是使用`Runtime`类或`ProcessBuilder`类。`...

    java程序调用bat文件,执行oracel数据库备份

    首先,我们需要理解Java调用外部程序的基本原理。在Java中,我们可以使用`Runtime`类或`ProcessBuilder`类来执行操作系统级别的命令,例如运行bat文件。以下是一个简单的示例,展示如何使用`Runtime.getRuntime()....

    surfer二次开发-java调用exe

    `SurferUtil.java`是Java源代码文件,这是Java调用VB开发的Surfer功能的关键部分。在Java中,通常采用`ProcessBuilder`或`Runtime.exec()`方法来执行外部命令(即`sufercounter.exe`)。同时,为了传递参数和接收...

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    java调用exe可执行文件

    在Java编程中,有时我们需要与操作系统进行交互,例如调用已存在的Windows系统下的.exe可执行文件。这在处理一些特定的任务,如自动化脚本、数据分析或者其他需要借助外部工具完成的功能时非常常见。本文将深入探讨...

    sybase数据库存储过程调用外部JAVA

    Sybase数据库系统,作为一款企业级的关系型数据库管理系统,提供了与Java语言的集成,使得开发人员可以在存储过程中调用外部Java程序,这对于无需依赖系统服务器进行定时任务调度的情况尤其有用。本文将详细介绍如何...

    java通过url调用接口

    在Java编程中,通过URL调用接口是一种常见的网络通信方式,尤其在Web服务和API交互中扮演着重要角色。这个项目提供了一种方法,通过URL发送请求并接收响应,然后将响应的字符串转换为JSON格式进行处理。接下来,我们...

    Java调用Kettle代码

    Java调用Kettle代码主要涉及两个关键点:Java编程与Kettle(Pentaho Data Integration,简称PDI)工具的集成。Kettle是一款强大的ETL(Extract, Transform, Load)工具,用于数据抽取、转换和加载。Java作为广泛应用...

    Java调用有道翻译

    在IT行业中,调用外部服务来增强应用功能是一种常见的做法,比如使用有道翻译API来实现文本翻译。本文将详细讲解如何在Java环境下调用有道翻译API,以实现高效、便捷的多语言翻译功能。 首先,有道翻译API提供了一...

    java调用dos命令

    批处理文件通常包含一系列的DOS命令,通过Java调用这些文件可以执行更复杂的操作。以下是示例代码: ```java public class BatchFileRunner { public static void main(String[] args) { try { String ...

    Kettle API - Java调用示例

    Kettle API 是一个强大的工具,允许开发者通过Java代码与Pentaho Data Integration (Kettle) 进行交互,实现数据提取、转换和加载(ETL)过程的自动化。在给定的示例中,主要展示了如何使用Kettle API 创建、保存和...

Global site tag (gtag.js) - Google Analytics