文件解压(Java)

package com.jk.Md5;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author Dana·Li
 *         <p>
 *         程序实现了ZIP解压[decompression]
 *         <p>
 *         大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。
 *         <p>
 *         在本段代码中,实现的是解压部分;
 */
public class ZipUtil {

	public static void main(String[] args) throws IOException {
		String file = "D:\\a\\a\\EXCPTACCTF_20191003_108135.zip";
		int unZip = ZipUtil.unZip(file);
		System.out.println(unZip);
	}

	public static int unZip(String zipfile) throws IOException {
		// 标识文件个数
		int sum = 0;
		// 检查是否是zip文件,并判断文件是否存在
		checkFileName(zipfile);
		File zfile = new File(zipfile);
		// 获取待解压文件的父路径
		String Parent = zfile.getParent() + "\\";
		FileInputStream fis = new FileInputStream(zfile);
		Charset charset = Charset.forName("GBK");// 默认UTF-8
		// CheckedInputStream cis = new CheckedInputStream(fis,new CRC32());
		ZipInputStream zis = new ZipInputStream(fis, charset);// 输入源zip路径
		ZipEntry entry = null;
		BufferedOutputStream bos = null;

		String[] split = zipfile.split("\\\\");
		File file1 = new File(Parent + split[split.length - 1].split("\\.")[0]);
		file1.mkdirs();
		while ((entry = zis.getNextEntry()) != null) {
			File filePath = new File(file1 + "\\" + entry.getName());
			if (filePath.isDirectory())
				continue;
			// 如果目录不存在,则创建
			File f1 = null;
			String f2 = null;
			if (!filePath.exists()) {
				String str = entry.getName();
				String[] split2 = str.split("/");
				if (split2.length > 1) {
					f1 = new File(file1 + "\\" + split2[0]);
					f2 = sum + split2[1];
					f1.mkdirs();
					filePath = new File(f1 + "\\" + f2);
				} else {
					filePath = new File(file1 + "\\" + sum + entry.getName());
				}
			}

			System.out.println(filePath.isDirectory());
			if (!filePath.isDirectory()) {
				FileOutputStream fos = new FileOutputStream(filePath);
				bos = new BufferedOutputStream(fos);
				byte buf[] = new byte[1024];
				int len;
				while ((len = zis.read(buf)) != -1) {
					bos.write(buf, 0, len);
				}
				zis.closeEntry();
				// 关闭的时候会刷新
				bos.close();
			}
			sum++;
		}
		zis.close();
		return sum;
	}

	private static void checkFileName(String name) {
		// 文件是否存在
		if (!new File(name).exists()) {
			System.err.println("要解压的文件不存在!");
			System.exit(1);
		}
		// 判断是否是zip文件
		int index = name.lastIndexOf(".");
		String str = name.substring(index + 1);
		if (!"zip".equalsIgnoreCase(str)) {
			System.err.println("不是zip文件,无法解压!");
			System.exit(1);
		}
	}

}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值