`

定期备份web工程,压缩为.zip文件

    博客分类:
  • java
阅读更多

前些天写了个小练习,定期备份web工程,感觉有点意思,也有点小用处。由于最近封闭开发,下班比较晚,所以电脑一般不关机,省得麻烦,这样就可以一直开着我本机的web服务器,每天备份我的web工程了。备份可是个好东西,搞不好哪天程序出了点小问题,或者电脑出了点小故障,再或者一不小心按了个delete,备份可就大有用处了。

 

    我最终要实现的功能是每天晚上 23:59:59 的时候将我的web工程压缩成一个以日期为后缀的 .zip 文件。

 

    首先是写一个压缩 zip 文件的类,可以将一个或多个文件(或文件夹)压缩成zip文件。利用很多web容器都提供的ant.jar,可以很方便的压缩一个zip文件。网上有很多压缩zip的例子,不过有的例子压缩出的zip中,生成了一些多余的东西,下面是我的压缩zip文件的类:

Java代码 复制代码
  1. package com.why.bak;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileOutputStream;   
  6.   
  7. import org.apache.tools.zip.ZipOutputStream;   
  8. /**  
  9.  * 将一个或多个文件压缩成 .zip 格式  
  10.  * @author 吴宏宇 2009-2-27  
  11.  *  
  12.  */  
  13. public class ZipUtil {   
  14.        
  15.     /**  
  16.      * 传入要压缩成的文件名,待压缩文件名或目录名,将待压缩文件或目录压缩成 .zip格式  
  17.      * 如    要将 C 盘下 test 文件夹压缩成 test_bak.zip 文件,则执行  
  18.      *      zip("C:\\test_bak.zip","C:\\testzip");  
  19.      * @param zipFileName  压缩后的文件名(包含全路径名)  
  20.      * @param inputFileName   待压缩文件名(包含全路径名)  
  21.      * @throws Exception  
  22.      */  
  23.     public void zip(String zipFileName, String inputFileName) throws Exception {   
  24.         ZipOutputStream out = new ZipOutputStream(new FileOutputStream( zipFileName));    
  25.         zip(out, new File(inputFileName), new File(inputFileName).getName());   
  26.         // System.out.println("zip done");   
  27.         out.close();   
  28.     }   
  29.        
  30.     /**  
  31.      * 传入要压缩成的文件名,待压缩文件名或目录名数组,将待压缩的多个文件或目录压缩成 .zip格式  
  32.      * 如    要将 C 盘下 test 文件夹及 test.txt 文件压缩成 test_bak.zip 文件,则执行  
  33.      *      zip("C:\\test_bak.zip",new String[]{"C:\\test.txt", "C:\\test"});  
  34.      * @param zipFileName  
  35.      * @param inputFileName  
  36.      * @throws Exception  
  37.      */  
  38.     public static void zips(String zipFileName, String inputFileName[]) throws Exception {   
  39.         ZipOutputStream out = new ZipOutputStream(new FileOutputStream( zipFileName));    
  40.         File file ;   
  41.         for(int i=0;i<inputFileName.length;i++){   
  42.             file = new File(inputFileName[i]);   
  43.             zip(out, file, file.getName());            
  44.         }   
  45.         // System.out.println("zip done");   
  46.         out.close();   
  47.     }   
  48.   
  49.     public static void zip(ZipOutputStream out, File f, String base)   
  50.             throws Exception {   
  51.         if (f.isDirectory()) {   
  52.             File[] fl = f.listFiles();   
  53.                
  54.             String symbol = "";   
  55.             if (System.getProperty("os.name").startsWith("Windows")) {   
  56.                 symbol = "\\";   
  57.             } else {   
  58.                 symbol = "/";   
  59.             }   
  60.   
  61.             for (int i = 0; i < fl.length; i++) {   
  62.                 zip(out, fl[i], base + symbol + fl[i].getName());   
  63.             }   
  64.         } else {   
  65.             out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));   
  66.             FileInputStream in = new FileInputStream(f);   
  67.             int b;   
  68.             //System.out.println(base);   
  69.             while ((b = in.read()) != -1) {   
  70.                 out.write(b);   
  71.             }   
  72.             in.close();   
  73.   
  74.         }   
  75.   
  76.     }   
  77.   
  78.     /**  
  79.      * @param args  
  80.      */  
  81.     public static void main(String[] args) {   
  82.         String files[] = {"C:\\response.txt""C:\\testzip测试","C:\\cmd.txt"};   
  83.         try {   
  84.             zips("C:\\test测试zips.zip", files);zips("",new String[]{"C:\\response.txt""C:\\testzip测试","C:\\cmd.txt"});   
  85.         } catch (Exception e) {   
  86.             // TODO 自动生成 catch 块   
  87.             e.printStackTrace();   
  88.         }   
  89.   
  90.     }   
  91.   
  92. }  
package com.why.bak;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.tools.zip.ZipOutputStream;
/**
 * 将一个或多个文件压缩成 .zip 格式
 * @author 吴宏宇 2009-2-27
 *
 */
public class ZipUtil {
	
	/**
	 * 传入要压缩成的文件名,待压缩文件名或目录名,将待压缩文件或目录压缩成 .zip格式
	 * 如 	要将 C 盘下 test 文件夹压缩成 test_bak.zip 文件,则执行
	 * 		zip("C:\\test_bak.zip","C:\\testzip");
	 * @param zipFileName  压缩后的文件名(包含全路径名)
	 * @param inputFileName   待压缩文件名(包含全路径名)
	 * @throws Exception
	 */
	public void zip(String zipFileName, String inputFileName) throws Exception {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(	zipFileName)); 
		zip(out, new File(inputFileName), new File(inputFileName).getName());
		// System.out.println("zip done");
		out.close();
	}
	
	/**
	 * 传入要压缩成的文件名,待压缩文件名或目录名数组,将待压缩的多个文件或目录压缩成 .zip格式
	 * 如 	要将 C 盘下 test 文件夹及 test.txt 文件压缩成 test_bak.zip 文件,则执行
	 * 		zip("C:\\test_bak.zip",new String[]{"C:\\test.txt", "C:\\test"});
	 * @param zipFileName
	 * @param inputFileName
	 * @throws Exception
	 */
	public static void zips(String zipFileName, String inputFileName[]) throws Exception {
		ZipOutputStream out = new ZipOutputStream(new FileOutputStream(	zipFileName)); 
		File file ;
		for(int i=0;i<inputFileName.length;i++){
			file = new File(inputFileName[i]);
			zip(out, file, file.getName());			
		}
		// System.out.println("zip done");
		out.close();
	}

	public static void zip(ZipOutputStream out, File f, String base)
			throws Exception {
		if (f.isDirectory()) {
			File[] fl = f.listFiles();
			
			String symbol = "";
			if (System.getProperty("os.name").startsWith("Windows")) {
				symbol = "\\";
			} else {
				symbol = "/";
			}

			for (int i = 0; i < fl.length; i++) {
				zip(out, fl[i], base + symbol + fl[i].getName());
			}
		} else {
			out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
			FileInputStream in = new FileInputStream(f);
			int b;
			//System.out.println(base);
			while ((b = in.read()) != -1) {
				out.write(b);
			}
			in.close();

		}

	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String files[] = {"C:\\response.txt", "C:\\testzip测试","C:\\cmd.txt"};
		try {
			zips("C:\\test测试zips.zip", files);zips("",new String[]{"C:\\response.txt", "C:\\testzip测试","C:\\cmd.txt"});
		} catch (Exception e) {
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}

	}

}

 

    第二步,实现在 web 工程启动后定期执行备份任务。

    java.util.Timer 这个类有定时执行计划任务的功能,通过设定定时器的间隔时间,自动在此间隔时间后执行预先安排好的任务。

    通过 timer.schedule(TimerTask,0,0)方法设置要执行的任务以及间隔时间。schedule方法的第一个参数是需要执行的任务,类型为java.util.TimerTask,第二个参数为执行任务前等待时间,若为0则表示不等待,第三个参数为间隔时间,单位为毫秒。

    当web工程启动时,定时器开始计时,在整个web工程的生命周期里,会定期执行备份的任务,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期。

 

Java代码 复制代码
  1. package com.why.bak;   
  2.   
  3. import java.text.ParseException;   
  4. import java.text.SimpleDateFormat;   
  5. import java.util.Date;   
  6. import java.util.Timer;   
  7.   
  8. import javax.servlet.ServletContextEvent;   
  9. import javax.servlet.ServletContextListener;   
  10.   
  11. public class BakListener implements ServletContextListener {   
  12.   
  13.     private Timer timer = null;   
  14.        
  15.     /**  
  16.      * 在Web应用结束时停止任务  
  17.      */  
  18.     public void contextDestroyed(ServletContextEvent arg0) {   
  19.            
  20.         timer.cancel(); // 定时器销毁   
  21.   
  22.     }   
  23.   
  24.     /**  
  25.      * 在Web应用启动时初始化任务  
  26.      */  
  27.     public void contextInitialized(ServletContextEvent arg0) {   
  28.            
  29.         Date date = new Date();     //取得当前时间,精确到天   
  30.         Date toNight ;   
  31.         SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");   
  32.         SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
  33.         try {   
  34.             toNight = formatter2.parse(formatter1.format(date)+" 23:59:59");   
  35.             System.out.println("toNight = "+formatter2.format(toNight));   
  36.                
  37.             timer = new Timer(true);   
  38.             //设置任务计划,启动和间隔时间   
  39.             timer.schedule(new BakTask(), toNight, 86400000);//设置当前日期的23:59:59 开始执行     86400000毫秒为一天   
  40.         } catch (ParseException e) {   
  41.             e.printStackTrace();   
  42.             System.out.println("备份监听未能成功启动");   
  43.         }   
  44.            
  45.     }   
  46.   
  47. }  
package com.why.bak;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class BakListener implements ServletContextListener {

	private Timer timer = null;
	
	/**
	 * 在Web应用结束时停止任务
	 */
	public void contextDestroyed(ServletContextEvent arg0) {
		
		timer.cancel();	// 定时器销毁

	}

	/**
	 * 在Web应用启动时初始化任务
	 */
	public void contextInitialized(ServletContextEvent arg0) {
		
		Date date = new Date();		//取得当前时间,精确到天
		Date toNight ;
		SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		try {
			toNight = formatter2.parse(formatter1.format(date)+" 23:59:59");
			System.out.println("toNight = "+formatter2.format(toNight));
			
			timer = new Timer(true);
			//设置任务计划,启动和间隔时间
			timer.schedule(new BakTask(), toNight, 86400000);//设置当前日期的23:59:59 开始执行     86400000毫秒为一天
		} catch (ParseException e) {
			e.printStackTrace();
			System.out.println("备份监听未能成功启动");
		}
		
	}

}

 

    要使用这个监听器需要在 web.xml 中配置如下内容:

Xml代码 复制代码
  1. <listener>  
  2.     <listener-class>com.why.bak.BakListener</listener-class>  
  3. </listener>  
	<listener>
		<listener-class>com.why.bak.BakListener</listener-class>
	</listener>
	

 

    第三步,实现执行备份任务的类。

    实现备份任务的类需继承 java.util.TimerTask ,在这个类中实现备份工程文件的功能。这里将要备份的文件名以及要生成的文件名写死在了程序里,其实可以写在配置文件中,通过读取配置文件制定要备份的内容。

 

Java代码 复制代码
  1. package com.why.bak;   
  2.   
  3.   
  4. import java.text.SimpleDateFormat;   
  5. import java.util.Date;   
  6. import java.util.TimerTask;   
  7.   
  8. public class BakTask extends TimerTask {   
  9.   
  10.     public void run() {   
  11.         ZipUtil zipUtil = new ZipUtil();   
  12.         String fileToBak = "E:\\obs_workspace\\OBSWeb_wuhy";    //要备份的文件名   
  13.         String newFileName = "E:\\obs_workspace\\OBSWeb_why_bak\\OBSWeb_wuhy-bak-";     //要生成的.zip文件名   
  14.            
  15.         Date date = new Date();     //取得当前时间   
  16.         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");   
  17.         try {   
  18.             newFileName = newFileName + formatter.format(date) +".zip";   
  19.                
  20.             System.out.println("newFileName = " + newFileName);   
  21.                
  22.             zipUtil.zip(newFileName, fileToBak);   
  23.                
  24.         } catch (Exception e) {   
  25.             e.printStackTrace();   
  26.             System.out.println("备份出现异常");   
  27.         }   
  28.   
  29.     }   
  30.   
  31. }  
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    基于ASP的北国药苑BBS数据库自动备份压缩文件 v2.0.zip

    "基于ASP的北国药苑BBS数据库自动备份压缩文件 v2.0.zip" 这个标题表明我们正在处理一个特定版本(v2.0)的压缩文件,该文件的核心功能是为名为“北国药苑”的BBS论坛的数据库提供自动化备份服务。这个备份系统是用...

    ASP源码—北国药苑BBS数据库自动备份压缩文件 v2.0.zip

    这个"ASP源码—北国药苑BBS数据库自动备份压缩文件 v2.0.zip"是一个基于ASP技术的论坛系统——北国药苑BBS的数据库自动备份解决方案的版本2.0。该程序能够定期、自动地对数据库进行备份,以防止数据丢失,确保网站...

    Ionic.Zip.dll

    1. 数据备份:在开发备份解决方案时,可以利用Ionic.Zip.dll将用户数据打包成ZIP文件进行备份,减少存储空间,同时方便传输。 2. 文件分发:在软件发布中,可以将多个文件压缩成一个ZIP包,便于用户下载和安装。 3...

    备份MySQL的php类.zip

    3. 备份单个数据库:核心功能可能包括将一个完整的数据库转换为SQL文件。这个过程涉及查询MySQL的元数据,获取表结构和数据,然后将它们写入SQL脚本。 4. 表格选择与排除:类可能允许用户指定要备份或排除的特定...

    webweb.zip

    【标题】"webweb.zip" 是一个压缩文件,通常用于存储和传输一组相关的Web资源。在Web开发领域,这样的文件可能包含HTML、CSS、JavaScript、图片和其他构成网站所需的各种元素。这种类型的压缩文件有助于减少文件大小...

    minio.zip minio.zip

    对象存储将数据和元数据分离,使得数据更容易管理和备份。每个对象都有一个唯一的标识符,便于检索。 2. **高可用性**:MinIO支持多节点集群部署,可以实现自动故障切换,确保服务的连续性和数据的可靠性。这对于...

    php文件在线压缩程序类.zip

    这对于需要处理大量文件上传、备份或者提供下载服务的Web应用来说,无疑是一个非常实用的工具。 总的来说,"php文件在线压缩程序类.zip"提供的这个资源,通过集成PHP内置的压缩功能,为开发者提供了一种高效、便捷...

    springboot web本地仓库m2.zip

    SpringBoot Web 本地仓库m2.zip是一个用于备份和快速恢复Maven本地仓库的压缩文件。在软件开发过程中,特别是使用SpringBoot和Web技术栈时,Maven作为一个强大的构建工具,负责管理和下载项目依赖。M2是Maven默认的...

    爱心啊.zip

    9. **软件更新**:软件开发者通常会发布更新为.zip文件,让用户下载后覆盖旧版本,以完成更新。 10. **归档和组织**:用户可以将多个相关文件打包成一个.zip文件,方便归档和整理。 若能提供关于"爱心啊.zip"文件...

    web项目包.zip

    在IT行业中,Web项目是构建基于互联网的应用程序的常见方式,而"web项目包.zip"很显然就是一个包含了Web项目所有必要组件的压缩文件。这个压缩包可能是为了方便传输、存储或者部署到服务器上运行。接下来,我们将...

    icsharpcode.sharpziplib.dll文件.zip

    这个库,通常简称为SharpZipLib,是由IC#Code开发团队创建的,它提供了对ZIP、GZip、BZip2、Tar和7-Zip等格式的支持,同时也包含了加密和解密的功能,使得开发者能够在自己的项目中实现文件的加解密压缩。...

    华为 3700 web管理加载文件

    “S3700_52P-V100R006C00.002.web.zip”是一个ZIP压缩文件,通常包含用于Web管理的各种组件,如HTML文件、JavaScript脚本、图像资源以及CSS样式文件。这些文件一起构成了华为交换机的Web管理界面,允许管理员通过...

    js压缩工具.zip

    "js压缩工具.zip"正是这样一个专为JS文件和文件夹压缩设计的桌面软件。 该工具简化了JS压缩过程,用户只需打开软件并直接拖拽文件夹进去,工具便会自动处理内部的所有JS文件,将它们压缩成"min.js"的形式。"min.js...

    cwRsyncServer_4.1.0.zip

    1. **下载与解压**:首先从官方渠道下载cwRsyncServer_4.1.0.zip并解压缩到目标目录。 2. **安装服务**:运行安装脚本,将cwRsyncServer注册为Windows服务。 3. **配置服务**:根据需求编辑配置文件(如rsyncd....

    Ionic.Utils.Zip 1.3-1.7版本

    Ionic.Utils.Zip是一款基于.NET Framework的开源库,由Koogra开发,专为处理ZIP文件格式而设计。该库提供了一系列方便易用的API,允许开发者在.NET环境中进行高效的压缩和解压缩操作。本文将详细探讨其不同版本之间...

    wget1.21.4.zip安装包

    wget是互联网上广泛使用的命令行工具,用于从Web服务器上下载文件,尤其适用于非交互式环境,例如自动化脚本或计划任务。这个版本1.21.4可能是该软件的某个稳定更新,包含了错误修复、性能优化或者新功能。 在描述...

    网站备份文件扫描工具

    11.web.zip 代表扫描域名空间是否有web打包备份 = web.zip 12.#domain#.rar 代表当前扫描的域名 比如设置为 #domain#.rar 则实际扫描的是www.baidu.com.rar 13.#domain#.zip 代表当前扫描的域名 比如设置为 #...

    青龙.zip/青龙.zip/青龙.zip

    【标题】"青龙.zip/青龙.zip/青龙.zip" 暗示这是一个压缩文件,可能包含了多个层级的子目录或文件,其中的核心文件或目录名为“青龙”。在IT行业中,这样的命名可能代表着一个项目、软件或者数据集的名字。在Java...

    fusion2.zip

    在IT领域,这类压缩文件经常被用作软件分发、备份数据或者分享大文件的方式。 【描述】"fusion2.zip" 的描述简单,没有提供具体的内容信息,可能意味着它是一个包含特定版本或更新的"Fusion"系列产品的集合。...

    新建 360压缩 ZIP 文件.zip_hb_zip

    【标题】"新建 360压缩 ZIP 文件.zip_hb_zip" 暗示这是一个使用360压缩软件创建的ZIP格式的文件。ZIP是一种常见的文件归档和压缩格式,它允许用户将多个文件和文件夹打包成一个单一的文件,以便于存储、传输和分发。...

Global site tag (gtag.js) - Google Analytics