`

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远程调用Linux命令_java-linux-command.zip

    在项目"使用java远程调用Linux命令_java-linux-command"中,主要涉及的技术和知识点包括Java网络编程、进程管理、以及对Linux系统命令的调用。Java提供了丰富的API来执行这些操作,例如java.lang.Runtime和java.lang...

    基于Java和Shell的Recorder录音播放PCM设计源码

    Shell脚本在Linux环境下尤其有用,它能够执行复杂的命令序列,自动化各种繁琐的任务。比如,通过Shell脚本可以轻松地管理音频文件的上传下载、转码、批量处理等操作。 本项目的标签包括了“Java录音播放”、“PCM”...

    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语言的ERP后端设计源码

    本文将围绕一款基于Java核心语言开发的ERP(企业资源...对于希望学习和了解ERP后端开发的开发者而言,本项目是一份宝贵的资源,不仅可以学习到Java编程技术,还可以了解到Shell脚本的使用,以及系统设计的全面考量。

    基于Java、Shell、HTML和Plpgsql的jl_starter设计源码个人总结demo

    此外,项目中还包含了一些辅助文件,比如YAML配置文件用于存储各种配置信息,XML和JSON文件用于数据交换和配置,SQL文件用于数据库的结构定义和数据操作,DOCX文档用于记录项目文档,ZIP压缩文件用于源码的打包分发...

    基于Shell、Java、Python的多语言离线数据仓库2201A实训一设计源码

    这些SQL文件很可能包含了数据仓库的数据定义语言(DDL)和数据操作语言(DML),用于构建和维护数据库中的表结构、索引、视图以及执行数据的插入、更新和删除操作。Shell脚本的数量为27个,这些脚本可能用于自动化数据...

    10-HBase Shell命令操作1

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

    基于Java和Shell的文件共享系统后端设计源码

    本项目是一个采用Java语言和Shell脚本开发的文件共享系统后端设计源码,共包含228个文件,主要组成部分包括178个Java源代码文件、27个XML配置文件、4个SQL数据库脚本、4个YAML配置文件、2个文本文件、2个属性文件、2...

    基于Java、Shell、Python语言的博物馆训练系统大一新生教学设计源码

    根据提供的文件信息,本文将对“基于Java、Shell、Python语言的博物馆训练系统大一新生教学设计源码”进行详细的知识点梳理。首先,该项目是一个专门针对大学一年级新生设计的博物馆训练系统,其核心目的是帮助学生...

    基于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是一个用于...

    java开源包101

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

    shell脚本进行js和css的压缩

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

Global site tag (gtag.js) - Google Analytics