- 浏览: 700712 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- 系统架构设计 (16)
- java collection framework (2)
- java分布式 (4)
- java多线程 (0)
- 故障处理及调优 (16)
- 软件开发过程及管理 (28)
- OS (5)
- 常用算法 (3)
- design pattern (8)
- transaction (7)
- java apps (48)
- corejava (7)
- java and DB (10)
- cache (0)
- webservice (14)
- web前端 (25)
- 报表 (4)
- 日志系统设计 (3)
- Oracle (4)
- mysql (11)
- xml (11)
- 数据源配置管理 (3)
- 企业数据存储 (4)
- php (2)
- 测试 (1)
最新评论
-
orangebook:
对于初学者来说,这样编写可能会误导,理解更烦锁。
观察者模式(发布-订阅) -
liudajiang:
呵呵 startThreads(rand ...
实践缩小Java synchronized 粒度 -
zengwenbo5566:
谢谢博主,学习了
解决getOutputStream() has already been called for this response -
u011335423:
大神厉害啊 可以了
解决getOutputStream() has already been called for this response -
xiang37:
...
解决getOutputStream() has already been called for this response
项目需求:
将迁移来的数据文件进行压缩。要求压缩过程耗时尽量少,尽量降低资源消耗。
实现思路:
经过测试决定采用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状态码及实例
2018-03-24 15:06 0HTTP常用状态码列表: ... -
java同步机制及synchronized关键字的应用2
2013-03-25 22:03 1559类定义: public class Test{ ... -
实践缩小Java synchronized 粒度
2013-03-07 22:09 2128项目需求: 产品需要监视不同种类的多个数据库,例如:多个 ... -
java同步机制及synchronized关键字的应用1
2013-03-05 23:04 995Java对多线程的支持与同步机制深受大家的喜爱,通过JMM ... -
Thread_管理异步、定时及周期性任务
2012-09-24 14:43 1306项目中有很多异步、定时及周期性任务的需求,其实现有一定的特点, ... -
Thread_跨节点集合查询
2012-09-18 16:56 1674项目中数据库进行了水平切分,为了处理跨节点集合查询,采用了多线 ... -
Thread_大批量数据的分页处理(生产者-消费者)
2012-09-17 13:30 1409java应用中通常会有处理大批量数据的场景,这里介绍一种分 ... -
Thread_wait、notify、notifyAll的使用方法
2012-09-17 11:19 6905wait()、notify()、notifyAll()是三个定 ... -
计算java对象占用的内存
2011-12-13 11:38 1076Java有一个很好的地方就是java的垃圾收集机制,这个机制集 ... -
quartz应用之一:创建、关闭定时任务
2011-07-18 17:15 3491项目需求: 数据迁移进程开始执行后,启动定时任务每隔30秒计 ... -
xtree应用实例
2011-03-11 18:02 1378最近项目中用到了构造树形目录的功能,简单了解了下dtree和x ... -
JDBC方式访问数据库
2011-01-10 13:48 14331、 JDBC是什么JDBC是Java数据库连接(Java ... -
应用系统中配置文件的应用场景及简要分析
2010-11-12 16:13 1220使用配置文件的有点不外乎两点: 1.提高系统的灵活性。 2 ... -
解决getOutputStream() has already been called for this response
2010-08-26 14:57 158655getOutputStream() has already b ... -
实战防止重复提交(token)应用思路及过程
2010-06-11 16:39 1623我这里只考虑了直接使用struts API的情况,使用自定义的 ... -
Struts国际化完整解决方案-支持多国语言
2010-06-11 16:38 2075在网上有很多有关Struts的中文解决方案,但是很多都说得很零 ... -
jsp查询条件的保留
2010-06-11 16:23 2797本文适合java web开发初学者参考。 统计系统或者 ... -
java日期计算
2010-05-26 14:45 1343Calendar类:一个抽像类,不能直接new 得到。 Cal ... -
mvc应用实例
2010-04-04 19:58 1001最近参与到一个行业数据处理的项目,我负责数据请求和订阅的功能, ... -
反斜杠处理
2009-12-16 10:03 1263在Java中处理一些路径相关的问题的时候,如要取出ie浏览器上 ...
相关推荐
在实际应用中,使用Java执行shell命令和SSH连接有多种场景,例如自动化运维、分布式系统管理、跨平台数据同步等。通过SSH,开发者可以在Java程序中安全地控制远程服务器,执行备份、监控、配置更新等操作。Ganymed ...
标题“java_shell_template.tar.gz”表明这是一个与Java和Shell脚本相关的压缩文件,其中可能包含了一个用于处理Java字段的模板生成器。这个压缩包可能是为了帮助开发者自动化处理Java类中的字段,比如生成getter和...
在这个场景中,我们关注的是如何使用Java来实现文件压缩包的上传以及在服务器上的解压缩。Java作为一种强大的编程语言,提供了丰富的库来支持这样的操作,特别是在涉及到SFTP(Secure File Transfer Protocol)时,...
在Linux环境下,Java程序可以通过Runtime或ProcessBuilder类执行shell命令,例如gzip和gunzip,来实现对GZ文件的操作。这种方式适用于处理整个目录或复杂的情况,但需要注意的是,这种方式可能引入额外的安全风险,...
【标题】:“方法调用序列追踪工具” 在软件开发中,理解程序...总之,"方法调用序列追踪工具"是软件开发者强大的辅助工具,通过符号执行技术深入洞察Java应用程序的运行行为,为代码优化和故障排查提供了有力的支持。
如果你的项目中已经使用了Java,那么可以通过Java代码调用mysqldump命令来实现自动化备份。首先,需要引入一个能够执行系统命令的库,如Apache Commons Exec。以下是一个简单的示例: ```java import org.apache....
2. Shell命令执行:Java程序可以调用Runtime或ProcessBuilder类来执行Linux Shell命令,如`ls`, `ps`, `top`等,获取服务器状态信息。 3. 自定义脚本:将Java与Shell脚本结合,可以创建复杂的运维流程,比如定期...
参考expect4j的交互式操作方式控制输入输出流实现批量执行多条shell命令同时支持切换用户输入密码提权执行命令输入密码等操作 有完整的测试用例,便于理解 模板化执行命令示例 [$]send[su - root] [Password:]...
该项目为IAM(身份与访问管理)系统提供详尽的手册、使用文档和接口文档,共计96个文件,涵盖42个Markdown文档、38个PNG图像文件、4个XML配置文件、4个Java源代码文件、3个Shell脚本文件、2个Git忽略规则文件、2个...
在实际应用中,由于直接使用Shell命令插入数据效率较低,通常会通过编程方式操作HBase,如使用Java API或HBase的客户端库。此外,HBase还提供了丰富的命令和功能,如表的分区、数据压缩、数据复制等,使得它成为...
通过查看源码,开发者可以了解如何在Java环境中创建一个功能完备的命令行shell,包括解析命令、执行系统调用以及处理用户输入等核心功能。 【标签】"java":这表示整个项目是使用Java语言编写的,Java是一种广泛...
"基于Java的开发的SHELL CRaSH.zip"是一个与Java相关的压缩文件,其中包含一个名为"crsh-1.1.0"的子文件。这个名称暗示了它可能是一个名为CRaSH(Command-line Remote Shell)的工具,版本为1.1.0。CRaSH是一个用于...
在这个场景下,这个脚本可能包含了调用YUI Compressor的命令,以及处理文件输入输出的逻辑,比如遍历目录下的所有js和css文件,然后使用YUI Compressor进行压缩,并将结果保存到特定的目录。 编写这样的shell脚本...
- `jtar.sh` 可能是Linux或Unix环境下的shell脚本,用于执行相同的功能。 - `ant.jar` 和 `jtar.jar` 是Java Archive(JAR)文件,其中包含了实现jtar功能的Java类和库。`ant.jar` 可能关联于Apache Ant,这是一个...
8. **文档和示例**:尽管描述没有明确提及,但完整的开源项目通常会包含使用指南和示例,帮助开发者快速理解和使用SHELL CRaSH。 通过深入研究这个项目,开发者不仅可以掌握SHELL CRaSH的工作原理,还能增强自己的...
在Java中调用JavaScript,可以使用ScriptEngineManager来创建一个特定的ScriptEngine实例,例如用于执行JavaScript的Nashorn引擎。以下是一个简单的示例: ```java import javax.script.ScriptEngineManager; ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...
Java Remote Desktop 是一个Java 的远程桌面软件,支持很多特性例如文件传输、数据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 ...