`

java调用shell执行数据压缩

 
阅读更多

项目需求:

将迁移来的数据文件进行压缩。要求压缩过程耗时尽量少,尽量降低资源消耗。

 

实现思路:

经过测试决定采用tar命令进行压缩。有一个问题:数据文件的目录和压缩后存放路径非同一路径,压缩时需要先cd到压缩目录下,然后才能将压缩包存放到指定目录下。经过查阅资料,决定采用java程序调用shell脚本的方式,执行目录的切换和压缩。

 

示例代码:

public File tar(String caseId,List baseTypeIdList,String caseTime,String localPath) throws Exception{
		String tarPkgName = "";
		localPath = localPath.replaceAll("//", "\\/");
		
		Map dirMap = new HashMap();
		Map zipDirs = this.getZipDirs(localPath,dirMap);
		
		String tarDir = MoveConstants.PATH_TAR_PKG_PREFIX + caseTime + File.separator;
		File zipDirObj = new File(tarDir);
		if(!zipDirObj.exists()){
			zipDirObj.mkdirs();
		}
		
		Set mapKeys = zipDirs.keySet();
		Iterator it = mapKeys.iterator();
		while (it.hasNext()) {
			String lastDir = (String) it.next();
			String allPath = (String) zipDirs.get(lastDir);
			
			String[] dirs = allPath.split("\\/");
			for(int i = 1; i < dirs.length; i++){
				if(i == 1){
					tarPkgName = dirs[i];
				}else{
					tarPkgName = tarPkgName +"_"+ dirs[i];
				}
			}
			String tarFileName = tarDir + tarPkgName + ".tar.gz";
			
			//如何定位到压缩目录
			//采用调用shell脚本的方式	
			String shellCmd = "sh /root/test.sh "+ tarDir +" "+ tarFileName +" "+ allPath;
			logger.debug("\n\n^^^^^^^^^^^^^^^^^^^ shellCmd = "+ shellCmd);
			
			int rtn = new JavaShellUtil().executeShell(shellCmd);
			logger.debug("\n\n^^^^^^^^^^^^^^^^^^^ shell rtn = "+ rtn);
		}
		
		return new File(MoveConstants.PATH_TAR_PKG_PREFIX + caseTime + File.separator);
	}

 

ublic class JavaShellUtil {
	// 基本路径
	private static final String basePath = "/usr/move_test/tar/";
	
	// 记录Shell执行状况的日志文件的位置(绝对路径)
	private static final String EXEC_SHELL_LOG = basePath + "execShell.log";
	
	
	public int executeShell(String shellCommand) throws IOException {
		int success = 0;
		StringBuffer stringBuffer = new StringBuffer();
		BufferedReader bufferedReader = null;
		
		// 格式化日期时间,记录日志时使用
		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS"); 
		try {
			stringBuffer.append(dateFormat.format(new Date())).append("准备执行Shell命令 ").append(shellCommand).append(" \r\n"); 
			Process pid = null;
			String[] cmd = {"/bin/sh", "-c", shellCommand};
		
			// 执行Shell命令
			pid = Runtime.getRuntime().exec(cmd);
			if (pid != null) {
				stringBuffer.append("进程号:").append(pid.toString()).append("\r\n");
				// bufferedReader用于读取Shell的输出内容
				bufferedReader = new BufferedReader(new InputStreamReader(pid.getInputStream()), 1024);
				pid.waitFor();
			} else {
				stringBuffer.append("没有pid\r\n");
			}
			
			stringBuffer.append(dateFormat.format(new Date())).append("Shell命令执行完毕\r\n执行结果为:\r\n");
			String line = null;
			// 读取Shell的输出内容,并添加到stringBuffer中
			while (bufferedReader != null &&(line = bufferedReader.readLine()) != null) {
				stringBuffer.append(line).append("\r\n");
			}
		}catch (Exception ioe) {
			stringBuffer.append("执行Shell命令时发生异常:\r\n").append(ioe.getMessage()).append("\r\n");
			
		}finally {if (bufferedReader != null) {
			OutputStreamWriter outputStreamWriter = null;
			try {
				bufferedReader.close();
				//将Shell的执行情况输出到日志文件中
				OutputStream outputStream = new FileOutputStream(EXEC_SHELL_LOG);
				outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
				outputStreamWriter.write(stringBuffer.toString());
			}catch (Exception e) {
				e.printStackTrace();
			}finally {
				outputStreamWriter.close();
			}
		}
			success = 1;
		}
		return success;
	}

}

 

shell脚本:

注意尽量在linux下编写,在windows上写好上传到linux上往往会有问题

 

#!/bin/bash

if [ $# != 3]; then
 echo "Please input 3 parameters!"
 exit
fi

cd $1
tar -zcvf $2 $3

 

 

http://moppet.taobao.com/

 

分享到:
评论

相关推荐

    JAVA执行shell命令小工具

    在实际应用中,使用Java执行shell命令和SSH连接有多种场景,例如自动化运维、分布式系统管理、跨平台数据同步等。通过SSH,开发者可以在Java程序中安全地控制远程服务器,执行备份、监控、配置更新等操作。Ganymed ...

    java_shell_template.tar.gz

    标题“java_shell_template.tar.gz”表明这是一个与Java和Shell脚本相关的压缩文件,其中可能包含了一个用于处理Java字段的模板生成器。这个压缩包可能是为了帮助开发者自动化处理Java类中的字段,比如生成getter和...

    使用Java向服务器上传文件压缩包并实现解压缩

    在这个场景中,我们关注的是如何使用Java来实现文件压缩包的上传以及在服务器上的解压缩。Java作为一种强大的编程语言,提供了丰富的库来支持这样的操作,特别是在涉及到SFTP(Secure File Transfer Protocol)时,...

    java压缩+解压GZ(Linux)文件.rar

    在Linux环境下,Java程序可以通过Runtime或ProcessBuilder类执行shell命令,例如gzip和gunzip,来实现对GZ文件的操作。这种方式适用于处理整个目录或复杂的情况,但需要注意的是,这种方式可能引入额外的安全风险,...

    方法调用序列追踪工具

    【标题】:“方法调用序列追踪工具” 在软件开发中,理解程序...总之,"方法调用序列追踪工具"是软件开发者强大的辅助工具,通过符号执行技术深入洞察Java应用程序的运行行为,为代码优化和故障排查提供了有力的支持。

    mysqldump java远程备份mysql数据库 cmd备份

    如果你的项目中已经使用了Java,那么可以通过Java代码调用mysqldump命令来实现自动化备份。首先,需要引入一个能够执行系统命令的库,如Apache Commons Exec。以下是一个简单的示例: ```java import org.apache....

    简易java运维工具

    2. Shell命令执行:Java程序可以调用Runtime或ProcessBuilder类来执行Linux Shell命令,如`ls`, `ps`, `top`等,获取服务器状态信息。 3. 自定义脚本:将Java与Shell脚本结合,可以创建复杂的运维流程,比如定期...

    Jsch批量执行多条命令,包含切换用户输入密码

    参考expect4j的交互式操作方式控制输入输出流实现批量执行多条shell命令同时支持切换用户输入密码提权执行命令输入密码等操作 有完整的测试用例,便于理解 模板化执行命令示例 [$]send[su - root] [Password:]...

    基于Java和Shell的IAM用户手册与接口文档设计源码

    该项目为IAM(身份与访问管理)系统提供详尽的手册、使用文档和接口文档,共计96个文件,涵盖42个Markdown文档、38个PNG图像文件、4个XML配置文件、4个Java源代码文件、3个Shell脚本文件、2个Git忽略规则文件、2个...

    10-HBase Shell命令操作1

    在实际应用中,由于直接使用Shell命令插入数据效率较低,通常会通过编程方式操作HBase,如使用Java API或HBase的客户端库。此外,HBase还提供了丰富的命令和功能,如表的分区、数据压缩、数据复制等,使得它成为...

    基于java的开发源码-开发的SHELL CRaSH.zip

    通过查看源码,开发者可以了解如何在Java环境中创建一个功能完备的命令行shell,包括解析命令、执行系统调用以及处理用户输入等核心功能。 【标签】"java":这表示整个项目是使用Java语言编写的,Java是一种广泛...

    基于Java的开发的SHELL CRaSH.zip

    "基于Java的开发的SHELL CRaSH.zip"是一个与Java相关的压缩文件,其中包含一个名为"crsh-1.1.0"的子文件。这个名称暗示了它可能是一个名为CRaSH(Command-line Remote Shell)的工具,版本为1.1.0。CRaSH是一个用于...

    shell脚本进行js和css的压缩

    在这个场景下,这个脚本可能包含了调用YUI Compressor的命令,以及处理文件输入输出的逻辑,比如遍历目录下的所有js和css文件,然后使用YUI Compressor进行压缩,并将结果保存到特定的目录。 编写这样的shell脚本...

    压缩tar包工具

    - `jtar.sh` 可能是Linux或Unix环境下的shell脚本,用于执行相同的功能。 - `ant.jar` 和 `jtar.jar` 是Java Archive(JAR)文件,其中包含了实现jtar功能的Java类和库。`ant.jar` 可能关联于Apache Ant,这是一个...

    基于Java的实例源码-开发的SHELL CRaSH.zip

    8. **文档和示例**:尽管描述没有明确提及,但完整的开源项目通常会包含使用指南和示例,帮助开发者快速理解和使用SHELL CRaSH。 通过深入研究这个项目,开发者不仅可以掌握SHELL CRaSH的工作原理,还能增强自己的...

    java如何与脚本(javaScript)之间相互调用二

    在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...

    java开源包8

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包1

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包6

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

    java开源包4

    Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...

Global site tag (gtag.js) - Google Analytics