java 压缩解压 zip

package com.test.zipFile;

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

import org.junit.Test;

/**
 * 通过Java的Zip输入输出流实现压缩和解压文件
 * 
 */
public class ZipUtil {

	public ZipUtil() {
		// empty
	}

	/**
	 * 压缩文件
	 * 
	 * @param filePath
	 *            待压缩的文件路径
	 * @return 压缩后的文件
	 * @throws Exception
	 */
	public static File zip(String filePath) throws Exception {
		File target = null;
		File source = new File(filePath);
		if (source.exists()) {
			// 压缩文件名=源文件名.zip
			String zipName = source.getName() + ".zip";
			target = new File(source.getParent(), zipName);
			if (target.exists()) {
				target.delete(); // 删除旧的文件
			}
			FileOutputStream fos = null;
			ZipOutputStream zos = null;
			try {
				fos = new FileOutputStream(target);
				zos = new ZipOutputStream(new BufferedOutputStream(fos));
				// 添加对应的文件Entry
				addEntry("", source, zos);
			} catch (IOException e) {
				throw new RuntimeException(e);
			} finally {
				if (null != zos) {
					zos.close();
				}
				if (null != fos) {
					fos.close();
				}

			}
		}
		return target;
	}

	/**
	 * 扫描添加文件Entry
	 * 
	 * @param base
	 *            基路径
	 * 
	 * @param source
	 *            源文件
	 * @param zos
	 *            Zip文件输出流
	 * @throws IOException
	 */
	@SuppressWarnings("resource")
	private static void addEntry(String base, File source, ZipOutputStream zos) throws Exception {
		// 按目录分级,形如:aaa/bbb.txt
		String entry = base + source.getName();
		if (source.isDirectory()) {
			for (File file : source.listFiles()) {
				// 递归列出目录下的所有文件,添加文件Entry
				addEntry(entry + "/", file, zos);
			}
		} else {
			FileInputStream fis = null;
			BufferedInputStream bis = null;
			byte[] buffer = new byte[1024 * 10];
			fis = new FileInputStream(source);
			bis = new BufferedInputStream(fis, buffer.length);
			int read = 0;
			zos.putNextEntry(new ZipEntry(entry));
			while ((read = bis.read(buffer, 0, buffer.length)) != -1) {
				zos.write(buffer, 0, read);
			}
			zos.closeEntry();
		}
	}

	/**
	 * 解压文件
	 * 
	 * @param filePath
	 *            压缩文件路径
	 * @throws Exception
	 */
	public static void unzip(String filePath) throws Exception {
		File source = new File(filePath);
		if (source.exists()) {
			ZipInputStream zis = null;
			BufferedOutputStream bos = null;
			zis = new ZipInputStream(new FileInputStream(source));
			ZipEntry entry = null;
			while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) {
				File target = new File(source.getParent(), entry.getName());
				if (!target.getParentFile().exists()) {
					// 创建文件父目录
					target.getParentFile().mkdirs();
				}
				// 写入文件
				bos = new BufferedOutputStream(new FileOutputStream(target));
				int read = 0;
				byte[] buffer = new byte[1024 * 10];
				while ((read = zis.read(buffer, 0, buffer.length)) != -1) {
					bos.write(buffer, 0, read);
				}
				bos.flush();
			}
			zis.closeEntry();
			if (null != zis) {
				zis.close();
			}
			if (null != bos) {
				bos.close();
			}

		}
	}

	public static void main(String[] args) throws Exception {
		String targetPath = "D:/CSVFile";
		File file = ZipUtil.zip(targetPath);
		System.out.println(file);
	}

	@Test
	public void testZipFile() throws Exception {
		File sourceFile = new File("D:/aaabb.docx");
		InputStream inputStream = new FileInputStream(sourceFile);
		OutputStream out = new FileOutputStream("d:/aaabbbccc.zip");
		ZipOutputStream zipOut = new ZipOutputStream(out);

		String entry = sourceFile.getName();
		zipOut.putNextEntry(new ZipEntry(entry)); // 把要压缩的文件put Entry
		int b = -1;
		while ((b = inputStream.read()) != -1) {
			zipOut.write(b);
		}
		zipOut.closeEntry();
		zipOut.close();
		inputStream.close();

	}
	
	@Test
	public void testUnZipFile() throws Exception{
		File zipFile = new File("D:/aaabbbccc.zip");
		ZipInputStream zipInput = new ZipInputStream(new FileInputStream(zipFile));
		ZipEntry nextEntry = zipInput.getNextEntry();
		String name = nextEntry.getName();
		
		File outPutFile = new File("d:/uu/");
		
		if(!outPutFile.exists()){
			outPutFile.mkdirs();
		}
		FileOutputStream out = new FileOutputStream(outPutFile.getAbsolutePath()+"/"+name);
		int b = -1;
		while ( (b = zipInput.read()) != -1 ) {
			out.write(b);
		}
		out.close();
		zipInput.closeEntry();
		zipInput.close();
	}
	
}

猜你喜欢

转载自1960370817.iteye.com/blog/2392936
今日推荐