使用java.util.zip包实现根据文件目录控制文件的压缩与解压

根据文件目录实现文件的压缩与解压

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

public class ZipFile {
	public static void main(String[] args) {
		//压缩测试
//		int count = doZip("D:\\Personality\\pdf\\zipTest", "myZip.zip");
		//解压测试
		int count = unzip("D:\\Personality\\pdf\\zipTest", "myZip.zip");
		System.out.println(count);
	}

	/** 缓冲器大小 */
	private static final int BUFFER = 1024;

	/**
	 * decompression
	 * @param srcPath	待解压文件路径
	 * @param zipFileName	带解压文件名称
	 * @return	解压文件个数
	 */
	public static int unzip( String srcPath,String zipFileName) {
		
		ZipInputStream zipInputStream = null;
		//ZIP文件入口
		ZipEntry zipEntry = null;
		//缓冲区
		byte[] buffer = new byte[BUFFER];
		// 本次读出来的长度
		int readLength = 0;
		//解压文件个数
		int count = 0;
		try {
			zipInputStream = new ZipInputStream(new FileInputStream(srcPath+"//"+zipFileName));
			while ((zipEntry = zipInputStream.getNextEntry()) != null) {
				
				// 若是ZIP条目目录,则需创建这个目录
				if (zipEntry.isDirectory()) {
					File dir = new File(srcPath + "/" + zipEntry.getName());
					if (!dir.exists()) {
						dir.mkdirs();
						continue;
					}
				}
				// 若是文件,则需创建该文件
				File file = createFile(srcPath, zipEntry.getName());
				count++;
				OutputStream outputStream = new FileOutputStream(file);
				while ((readLength = zipInputStream.read(buffer, 0, BUFFER)) != -1) {
					outputStream.write(buffer, 0, readLength);
				}
				outputStream.close();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return -1;
		} catch (IOException e) {
			e.printStackTrace();
			return -2;
		} finally {
			//关闭流
			try {
				if (zipInputStream != null)
					zipInputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
				return -2;
			}
		}
		return count;
	}

	/**
	 * compression
	 * @param srcPath     待压缩文件目录
	 * @param zipFileName 压缩后文件名称
	 * @return 压缩文件个数
	 */
	public static int doZip(String srcPath, String zipFileName) {

		File srcFile = new File(srcPath);
		//通过路径获取文件集合
		List <File> fileList = getAllFiles(srcFile);
		//缓冲区
		byte[] buffer = new byte[BUFFER];
		//ZIP文件入口
		ZipEntry zipEntry = null;
		//本次读取长度
		int readLength = 0;
		ZipOutputStream zipOutputStream = null;
		//压缩后文件的名称
		String newZipFileName;
		//压缩文件总个数
		int count = 0;
		
		if(zipFileName==null||zipFileName.length()==0) {
			newZipFileName= srcPath+"newZip.zip";
		}else {
			newZipFileName = srcPath+"\\"+zipFileName;
		}
		
		try {			
			zipOutputStream = new ZipOutputStream(new FileOutputStream(newZipFileName));
			for (File file : fileList) {
				// 若是文件,则压缩这个文件
				if (file.isFile()) {
					count++;
					zipEntry = new ZipEntry(getRelativePath(srcPath, file));
					zipEntry.setSize(file.length());
					zipEntry.setTime(file.lastModified());
					zipOutputStream.putNextEntry(zipEntry);
					InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
					while ((readLength = inputStream.read(buffer, 0, BUFFER)) != -1) {
						zipOutputStream.write(buffer, 0, readLength);
					}
					inputStream.close();
				} else {
					zipEntry = new ZipEntry(getRelativePath(srcPath, file) + "/");
					zipOutputStream.putNextEntry(zipEntry);
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			return -1;
		} catch (IOException e) {
			e.printStackTrace();
			return -2;
		} finally {
			try {
				if (zipOutputStream != null)
					zipOutputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
				return -2;
			}
		}
		return count;
	}
	
	/**
	 * get file list from srcFile
	 * @param srcFile  文件路径
	 * @return 	对文件路径下的所有文件集合
	 */
	private static List<File> getAllFiles(File srcFile) {

		List<File> fileList = new ArrayList<File>();
		File[] tmp = srcFile.listFiles();
		for (int i = 0; i < tmp.length; i++) {

			if (tmp[i].isFile()) {
				fileList.add(tmp[i]);
			}
			if (tmp[i].isDirectory()) {
				// 若不是空目录,则递归添加其下的目录和文件
				if (tmp[i].listFiles().length != 0) {
					fileList.addAll(getAllFiles(tmp[i]));
				}
				// 若是空目录,则添加这个目录到fileList
				else {
					fileList.add(tmp[i]);
				}
			}
		}

		return fileList;
	}


	private static String getRelativePath(String dirPath, File file) {
		File dir = new File(dirPath);
		String relativePath = file.getName();
		while (true) {
			file = file.getParentFile();
			if (file == null) {
				break;
			}

			if (file.equals(dir)) {
				break;
			} else {
				relativePath = file.getName() + "/" + relativePath;
			}
		}
		return relativePath;
	}

	private static File createFile(String srcPath, String fileName){
		
		// 将文件名的各级目录分解
		String[] dirs = fileName.split("/");
		File file = new File(srcPath);
		// 文件有上级目录
		if (dirs.length > 1) {
			for (int i = 0; i < dirs.length - 1; i++) {
				// 依次创建文件对象知道文件的上一级目录
				file = new File(file, dirs[i]);
			}
			if (!file.exists()) {
				// 文件对应目录若不存在,则创建
				file.mkdirs();
			}
			// 创建文件
			file = new File(file, dirs[dirs.length - 1]);
			return file;
		} else {
			if (!file.exists()) {
				// 若目标路径的目录不存在,则创建
				file.mkdirs();
			}
			// 创建文件
			file = new File(file, dirs[0]);
			return file;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿条秋裤到处跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值