用Java实现文件的解压缩

压缩流:

ZipInputStream(解压),ZipOutoutStream(压缩)来现实Zip的压缩和解压功能。

菜鸟编的代码,有大虾发现不足之处请多多包含~~

package com.shilei.io.解压缩文件;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Scanner;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
 * 文件的解压缩
 * @author shilei
 * @category 
 * @date 2013-4-16
 * @time 下午08:29:12
 * @version
 */
public class ZipStreamDemo2 {

	/**
	 * 压缩文件
	 * @param file      要解压的文件对象
	 * @param zipFile   压缩到的路径
	 */
	private static String path;
	private static String zipoutpath;

	public static void zipmethod(File file, String zipFileName)
			throws Exception {
		ZipOutputStream zos = null;
		path = file.getAbsolutePath();
		// System.out.println("path:"+path);
		// 判断文件是否文件夹

		if (!file.isDirectory()) {
			System.out.println(file.getName() + ":不是文件夹");
			return;
		} else {
			// 获得文件对象的集合
			File[] files = file.listFiles();
			if (zos == null) {// ZIP输出流为空则创建新的ZIP输出流
				FileOutputStream fos = new FileOutputStream(zipFileName);// 创建压缩文件的输出流对象
				zos = new ZipOutputStream(fos);// 创建新的ZIP输出流
			}
			readDir(file, zos);
			zos.close();
		}
		System.out.println("压缩完成...");
	}

	/**
	 * 
	 * @param fileDir 要压缩的文件对象       
	 * @param zipOut压缩的ZIP输出流            
	 * @throws Exception
	 */
	private static void readDir(File fileDir, ZipOutputStream zipOut)
			throws Exception {
		// 获得文件内的集合
		File[] files = fileDir.listFiles();

		String entryDir;
		for (File tempfile : files) {
			if (tempfile.isDirectory())// 是文件夹则递归
			{
				readDir(tempfile, zipOut);
			} else {
				// 读文件将数据写到压缩包中
				FileInputStream fis = new FileInputStream(tempfile);
				BufferedInputStream bis = new BufferedInputStream(fis);
				// 构建一个压缩条目,和文件名同名
				entryDir = tempfile.getAbsolutePath().substring(
						path.indexOf(':') + 2);

				// System.out.println(entryDir+"-----"+path);
				ZipEntry entry = new ZipEntry(entryDir);

				// 向压缩包中放入一个压缩条目
				zipOut.putNextEntry(entry);
				byte[] contents = new byte[1024];
				int end = -1;
				while ((end = bis.read(contents)) != -1) {
					// 将读到的数据写到压缩包中相应的条目
					zipOut.write(contents, 0, end);
					zipOut.flush();
				}
				bis.close();
			}
		}
	}

	/**
	 * 解压文件
	 * 
	 * @param file
	 *            指定解压文件的目录
	 * @param zipFilePath
	 *            要解压的文件的目录
	 */
	public static void unZipFile(File file, String zipFilePath)
			throws Exception {
		zipoutpath = file.getAbsolutePath();
		// System.out.println("zipoutpath:"+zipoutpath);
		// 定义压缩文件
		ZipFile zipFile = new ZipFile(zipFilePath);
		// 获得压缩文件的所有目录
		Enumeration entries = zipFile.entries();
		// 判断目标文件夹是否存在
		if (!file.exists()) {
			file.mkdirs();
		}
		while (entries.hasMoreElements()) { // 获得压缩条目的输入流
			ZipEntry entry = (ZipEntry) entries.nextElement();
			InputStream fis = zipFile.getInputStream(entry);
			BufferedInputStream bis = new BufferedInputStream(fis);

			// 写文件
			String filepath = zipoutpath.substring(0, 2) + "\\"
					+ entry.getName();// 建立一个与压缩条目相同的路径

			filepath = new String(filepath.getBytes("UTF-8"));
			File _file = new File(filepath);// 将路径转化为文件
			// System.out.println("_file:"+_file.getAbsolutePath()+" **** entry:"+entry.getName());
			if (entry.isDirectory()) {// 是文件夹就创建文件目录
				System.out.println("entry:  " + entry.getName());
				_file.mkdirs();
			} else {

				// System.out.println(_file.getParentFile().toString()+"----"+_file.toString());
				// 指定文件的目录不存在,则创建(即该文件的父文件夹)
				if (!_file.getParentFile().exists()) {
					_file.getParentFile().mkdirs();
				}
				// 获得输出流
				FileOutputStream fos = new FileOutputStream(_file);
				BufferedOutputStream bos = new BufferedOutputStream(fos);
				byte[] values = new byte[1024];
				int end = -1;
				while ((end = bis.read(values)) != -1) {
					bos.write(values, 0, end);
					bos.flush();
				}
				bos.close();
				bis.close();

			}
		}
		System.out.println("解压完成...");
	}

	public static void main(String[] args) {
		try {
			System.out.println("请选择你的操作:\n1.压缩文件\n2.解压文件");
			Scanner in = new Scanner(System.in);
			int operNum = in.nextInt();
			switch (operNum) {
			case 1:
				System.out.println("请输入要压缩的文件:");
				String dir = in.next();
				zipmethod(new File(dir), dir + ".zip");// 压缩
				break;
			case 2:
				System.out.println("请输入要解压的文件:");
				String undir = in.next();
				// System.out.println(undir.substring(0, undir.indexOf('.')));
				unZipFile(new File(undir.substring(0, undir.indexOf('.'))),
						undir);// 解压
			default:
				break;
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值