`

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

    通过java应用程序动态调用外部jar文件。

    Java调用外部程序命令

    F:\Work\Study\功能点技术\java调用可执行文件\Java调用外部程序命令.doc

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

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

    Kettle API - Java调用示例

    对向前兼容性的推荐 :如果想要动态地创造Transformation (例如:从元数据),使用XML文件方法(KTR)而不是使用API。 XML文件兼容Kettle所有版本,同样对job有效的。 下面的例子进行以下操作: 1创建Transformation ...

    java调用第三方天气预报实时API接口并解析数据【源码】

    1、封装WeatherInfo实体类,对接口返回的结果进行映射的实体类 2、WeatherUtils类,负责调用第三方天气预报api接口处理的工具类,包括根据城市查询等,返回的格式是json 3、test类,对接口进行功能性测试

    java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长

    java调用ffmpeg转换视频,并读取转换后视频的分辨率、大小以及时长。主要参考http://blog.sina.com.cn/s/blog_a5116c670102wiwj.html 的代码方式。步骤: 1.研究java如何调用外部程序 2.研究ffmpeg转换视频格式的...

    Java中如何调用matlab代码

    MATLAB的最新版本2006b中新添了一个产品-MATLAB Builder for Java。其实本来Matlab就有Java外部程序接口,不过原来的接口只能在.m文件中调用Java,而无法在Java程序中调用Matlab。

    httpClient调用远程接口获取数据到本地文件夹

    本例子是通过httpClient 不断的去电信的网站查询可选手机新号 , 每次查出来的数据保存到map , 到一定数量以后 , 保存在本地文件中 , 测试类可以直接运行.Java工程,Maven实现

    调用JAR包外的配置文件

    项目中,经常把一部分功能独立出来,做一个java project,然后打成jar包供其他项目引用...这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采用jar包读取外部配置文件。

    FineReport报表API源代码(报表调用)

    本代码主要开源了java报表工具中报表调用部分的代码,通过该开源代码,你可以了解报表工具的内部原理,掌握国内主流java报表工具的各类接口使用方法,并运用该接口对软件产品或项目中的个性化的需求进行二次开发。...

    JAVA动态加载JAR文件

    JAVA动态加载JAR文件以及反射调用其方法

    java调用7zip解压压缩包的实例

    下面小编就为大家带来一篇java调用7zip解压压缩包的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JAVA上百实例源码以及开源项目

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    实例展示使用Java压缩和解压缩7z文件的方法

    主要介绍了实例展示使用Java压缩和解压缩7z文件的方法,用到了7-zip的开源项目7-zip-JBinding,需要的朋友可以参考下

    Java开发技术大全(500个源代码).

    HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...

    JAVA上百实例源码以及开源项目源代码

     Java编写的网页版魔方游戏,编译后生成.class文件,然后用HTML去调用,不过运行时候需要你的浏览器安装有运行Class的插件。Java源代码实现部分,比较有意思,也具参考性。像坐标控制、旋转矩阵、定时器、生成图像...

    SpringBoot(32) 整合Forest实现调用第三方接口

    SpringBoot(32) 整合Forest实现调用第三方接口

    java开源包1

    你定义的Java源代码的语法规则,直接,没有必要专门编写和维护,外部语法文件。同时保持蒸提供全面的支持,无缝集成的IDE(语法着色,代码导航,重构等)的语法和操作代码完全分离。最大限度地减少时间和费用开发...

    DTU-DATACENTER.rar_DTU JAVA_DTU DATACENTER_java TCP/IP mysql_my

    该文件夹下project文件可用eclipse for java 直接打开编译。编译是需要注意的是将java-mysql的类库放置在C:\Program Files\Java\jre6\lib\ext路径下。本程序只用到这一个Java外部类库。 在源文件中,DataReceiver....

Global site tag (gtag.js) - Google Analytics