【java】将文件压缩为ZIP文件以及将ZIP文件解压缩java代码

上次在做关于文件打包——zip包的时候,整理的部分打包代码,可以直接运行。

主要功能:将文件压缩为ZIP文件以及将ZIP文件解压缩。比如格式:压缩F盘下的createFile目录,压缩后的文件是F:/createFilel.zip


package com.zf.s10.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;


/**
 * @文件名 TextReadZiP.java
 * @功能 将文件压缩为ZIP文件以及将ZIP文件解压缩
 *  <p> 比如格式:压缩F盘下的createFile目录,压缩后的文件是F:/createFilel.zip
 *  </p>
 * @作者 
 * @日期 2010-05-03
 * @版本 M1.0
 * @描述 Java 工具类
 */
public class TextReadZiP {
	
	/**
	 * 压缩文件或者目录
	 * 
	 * @param baseDirName 根目录,比如:F:/
	 * @param fileName 待压缩的文件名:路径+后缀
	 * @param toFileName 压缩后的目标文件名:路径+后缀
	 */
	public static void zipFiles(String baseDirName, String[] fileName, String toFileName) {
		if (baseDirName == null) { // 检测根目录是否存在
			System.out.println("压缩失败,根目录不存在:" + baseDirName);
			return;
		}
		File baseDir = new File(baseDirName); // 创建文件
		if (!baseDir.exists() || (!baseDir.isDirectory())) { // 判断文件是否是目录
			System.out.println("压缩失败,根目录不存在:" + baseDirName);
			return;
		}
		String baseDirPath = baseDir.getAbsolutePath();// 获得目录绝对路径
		File targetFile = new File(toFileName); // 目标文件
		try {
			ZipOutputStream out = new ZipOutputStream(new FileOutputStream(targetFile)); // 创建一个zip输出流来压缩数据并写入到zip文件
			//if (fileName.equals("*")) { // 如果是*号则将指定目录下的所有文件压缩到ZIP
			//	TextReadZiP.dirToZip(baseDirPath, baseDir, out);// 调用方法进行压缩
			//} else {// 压缩指定文件
			if (fileName!=null && fileName.length>0){
				String temp = "";
				File file = null;
				for (int i=0;i<fileName.length;i++){
					temp = fileName[i];
					file = new File(baseDir, temp); // 创建文件
					if (file.isFile()) { // 压缩的是否是文件
						// 压缩文件到ZIP输出流
						TextReadZiP.fileToZip(baseDirPath, file, out);
					} else { // 压缩目录到ZIP输出流
						TextReadZiP.dirToZip(baseDirPath, file, out);
					}
				}
			}
			out.close(); // ZIP输出流关闭
			System.out.println("压缩文件成功,目标文件名:" + toFileName);
		} catch (IOException e) { // 捕获异常
			System.out.println("压缩失败:" + e);
			e.printStackTrace();
		}
	}


//	/**
//	 * 解压缩ZIP文件
//	 * 
//	 * @param zipFileName 待解压缩的ZIP文件名
//	 * @param targetBaseDirName 解压缩后文件名
//	 */
//	public static void upzipFile(String zipFileName, String targetBaseDirName) {
//		if (!targetBaseDirName.endsWith(File.separator)) {
//			targetBaseDirName += File.separator;
//		}
//		try {
//			ZipFile zipFile = new ZipFile(zipFileName);// 根据ZIP文件创建ZipFile对象
//			ZipEntry entry = null; // ZIP实体
//			String entryName = null; // ZIP实体名
//			String targetFileName = null;
//			byte[] buffer = new byte[4096]; // 创建复制缓冲区
//			int bytes_read;
//			Enumeration entrys = zipFile.entries(); // 获取ZIP文件里所有的entry
//			while (entrys.hasMoreElements()) { // 遍历所有entry
//				entry = (ZipEntry) entrys.nextElement();// 依次获得所有entry
//				entryName = entry.getName(); // 获得entry的名字
//				targetFileName = targetBaseDirName + entryName;
//				if (entry.isDirectory()) { // 判断是否是目录,如果是
//					new File(targetFileName).mkdirs();// 创建目录
//					continue;
//				} else { // 如果是一个文件,则创建父目录
//					new File(targetFileName).getParentFile().mkdirs();
//				}
//				// 创建文件
//				File targetFile = new File(targetFileName);
//				// 输出绝对路径
//				System.out.println("创建文件:" + targetFile.getAbsolutePath());
//				// 打开文件输出流
//				FileOutputStream os = new FileOutputStream(targetFile);
//				// 从ZipFile对象中打开entry的输入流
//				InputStream is = zipFile.getInputStream(entry);
//				// 循环将内容写入文件输出流
//				while ((bytes_read = is.read(buffer)) != -1) {
//					os.write(buffer, 0, bytes_read);
//				}
//				os.close(); // 关闭流
//				is.close();
//			}
//			System.out.println("解压缩文件成功!");
//		} catch (IOException err) {
//			System.err.println("解压缩文件失败: " + err);
//		}
//	}


	/**
	 * 将目录压缩到ZIP输出流
	 * 
	 * @param baseDirPath 根目录:F:/
	 * @param dir 待压缩目录
	 * @param out ZIP输出流对象
	 */
	private static void dirToZip(String baseDirPath, File dir,
			ZipOutputStream out) {
		if (dir.isDirectory()) { // 判断是否是目录
			File[] files = dir.listFiles(); // 将目录下的所有文件放在文件集中
			if (files.length == 0) { // 判断文件集是否为空
				ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));
				try {
					out.putNextEntry(entry); // 复制字节到压缩文件
					out.closeEntry(); // 关系流实体
				} catch (IOException e) {
					e.printStackTrace();
				}
				return;
			}
			for (int i = 0; i < files.length; i++) {
				if (files[i].isFile()) { // 如果是文件,调用fileToZip方法
					TextReadZiP.fileToZip(baseDirPath, files[i], out);
				} else { // 如果是目录,递归调用
					TextReadZiP.dirToZip(baseDirPath, files[i], out);
				}
			}
		}
	}


	/**
	 * 将文件压缩到ZIP输出流
	 * 
	 * @param baseDirPath 根目录:E:/
	 * @param file 待压缩文件
	 * @param out ZIP输出流对象
	 */
	private static void fileToZip(String baseDirPath, File file, ZipOutputStream out) {
		FileInputStream in = null;
		ZipEntry entry = null;
		byte[] buffer = new byte[4096]; // 创建复制缓冲区
		int bytes_read;
		if (file.isFile()) { // 如果是文件
			try {
				in = new FileInputStream(file); // 创建一个文件输入流
				// 创建ZIP实体
				entry = new ZipEntry(getEntryName(baseDirPath, file));
				out.putNextEntry(entry); // 存储项信息到压缩文件
				// 复制字节到压缩文件
				while ((bytes_read = in.read(buffer)) != -1) {
					out.write(buffer, 0, bytes_read);
				}
				out.closeEntry(); // 关系流实体
				in.close();
				System.out.println("添加文件" + file.getAbsolutePath() + "到ZIP文件中!");
			} catch (IOException e) { // 捕获异常
				e.printStackTrace();
			}
		}
	}


	/**
	 * 获取待压缩文件相对于根目录的相对路径名
	 * 
	 * @param baseDirPath 根目录:F:/
	 * @param file 待压缩文件
	 * @return 返回待压缩文件相对根目录的路径
	 */
	private static String getEntryName(String baseDirPath, File file) {
		if (!baseDirPath.endsWith(File.separator)) {
			baseDirPath += File.separator;
		}
		String filePath = file.getAbsolutePath(); // 获得绝对路径
		if (file.isDirectory()) { // 判断是否是目录
			filePath += "/"; // 是则加文件分隔符将以目录项存储
		}
		int index = filePath.indexOf(baseDirPath); // 获得根目录
		// 返回待压缩文件相对根目录的路径
		return filePath.substring(index + baseDirPath.length());
	}


	public static void main(String[] args) {
		// 压缩 E 盘下的 TestDir 目录,压缩后的文件是 E:/createFile.zip
		String baseDirName = "E:/TestDir"; // 根目录
		//String fileName = "test.txt"; // 文件名
		String[] fileName = {"1.txt","2.txt","3.txt","test.txt"};
		String zipFileName = "E:/TestDir/createFile.zip"; // 目录文件名
		// 调用方法压缩文件或目录
		TextReadZiP.zipFiles(baseDirName, fileName, zipFileName);
		System.out.println(); // 换行
//		fileName = "E:/TestDir/createFile"; // 解压缩后文件名
//		TextReadZiP.upzipFile(zipFileName, fileName);// 调用方法解压缩文件或目录
	}
}




以下是struts2中的部分调用打zip代码,摘出来一部分,防止下次忘记,方便自己记忆。(多加了一个循环方法)

	@Override
	public String action() {
		fileDownload="";
		SnapShotService shotService = (SnapShotService) SpringHelper.getBean("tmg.screenShots.service.snapShot");
		ConditionBuilder conditions = getConditions();
		PageList snapShotList = shotService.getObjects(conditions, 1, 1000);
		System.out.println("文件数量:" + snapShotList.maxDates);
		StringBuffer str = new StringBuffer();
		SnapShot snapShot = null;
		for(int i=0;i<snapShotList.maxDates;i++){
			snapShot=(SnapShot) snapShotList.dates.get(i);
			str.append(snapShot.getPictureUrl() + ",");
			
			System.out.println("search.ids()打印结果为:" + snapShot.getPictureUrl());
			System.out.println("search.getPictureUrl()打印结果为:" + snapShot.getPictureUrl());
		}
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss");
		String baseDirName = getRoot() + File.separator; // 根目录
		String zipFileName = "zip"+ File.separator+format.format(new Date())+".zip"; // 目标目录文件名
		String[] fileNames = str.toString().split(","); // 获取每个文件的文件名
		
		String[] tempAry = new String[fileNames.length];
		
		System.out.println("fileNames:" + fileNames);
		for(int j=0; j<fileNames.length; j++){
			System.out.print("fileNames[j]的值为:" + fileNames[j] + " ");
			tempAry[j]=fileNames[j];
		}
		// 调用方法压缩文件或目录
		shotService.doZipFiles(baseDirName, tempAry, zipFileName);
		System.out.println("zipFileName :" + zipFileName);
		
		fileDownload = zipFileName;
		
		System.out.println(fileDownload); // 换行
//		snapShots.build();
		return "zip";
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值