Java 的zip压缩和解压缩

Java 的zip压缩和解压缩
好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代码如下:
package com.meritit.utils.zip;



import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

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.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipException;

import java.util.zip.ZipFile;

import java.util.zip.ZipOutputStream;



/**

 * @function 实现把指定文件夹下的所有文件压缩为指定文件夹下指定 zip 文件&&实现把指定文件夹下的 zip 文件解压到指定目录下

 * @createDate:2013-09-18

 * @author Ysjian

 */

public final class ZIPUtils {



	/**

	 * 测试

	 * 

	 * @param args

	 * @throws IOException 

	 * @throws ZipException 

	 */

	public static void main(String[] args) throws ZipException, IOException {

		// 把E:\\Ysjian_Job\\osgistart文件夹下的所有文件压缩到 E:\\test.jar中

		zip("E:\\test.xlsx", "E:\\test.jar");

		// 把E:\\test.jar 压缩文件内的所有文件解压到 E:\\test目录下面

		unZip("E:\\test.jar", "E:\\test");

	}



	private ZIPUtils() {

	}



	/**

	 * sourceFile 文件进行 zip

	 * 格式的压缩,如果sourceFile是目录,就将sourceFile目录下所有的文件及子目录压缩,如果sourceFile是文件

	 * ,将sourceFile文件压缩,保存为指定 .zip或者.jar 文件

	 * 

	 * @param sourceFile

	 *            源文件,

	 * @param savedFile

	 *            保存的文件,可以是.zip或者.jar形式

	 * 

	 */

	public static void zip(String sourceFile, String savedFile) {

		ZipOutputStream zos = null;

		try {

			zos = new ZipOutputStream(new BufferedOutputStream(

					new FileOutputStream(savedFile)));

			File file = new File(sourceFile);

			@SuppressWarnings("unused")

			boolean zip = file.isDirectory() ? zipFile(file, file.getPath(),

					zos) : zipFile(file, file.getParent(), zos);

		} catch (FileNotFoundException e) {

			throw new RuntimeException("filePath is invalid-->" + savedFile, e);

		} finally {

			try {

				zos.closeEntry();

				zos.close();

			} catch (IOException e) {

				throw new RuntimeException("fail to close the ZipOutputStream",

						e);

			}

		}

	}



	/**

	 * 压缩文件,利用到了递归

	 * 

	 * @param source

	 * @param basePath

	 * @param zos

	 * @throws IOException

	 */

	private static boolean zipFile(File source, String basePath,

			ZipOutputStream zos) {

		File[] files = null;

		if (source.isDirectory()) {

			files = source.listFiles();

		} else {

			files = new File[1];

			files[0] = source;

		}



		String path = null;

		byte[] buf = new byte[1024];

		int length = 0;

		BufferedInputStream bis = null;

		try {

			for (File file : files) {

				if (file.isDirectory()) {

					path = file.getPath().substring(basePath.length() + 1)

							+ "/";

					zos.putNextEntry(new ZipEntry(path));

					zipFile(file, basePath, zos);

				} else {

					path = file.getPath().substring(basePath.length() + 1);

					bis = new BufferedInputStream(new FileInputStream(file));

					zos.putNextEntry(new ZipEntry(path));

					while ((length = bis.read(buf)) > 0) {

						zos.write(buf, 0, length);

					}

				}

			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {

			if (bis != null) {

				try {

					bis.close();

				} catch (IOException e) {

					throw new RuntimeException(

							"fail to close the ZipOutputStream", e);

				}

			}

		}

		return true;

	}



	/**

	 * 解压 zip 文件,只能解压标准的 zip文件

	 * 

	 * @param sourceFile

	 *            标准的 zip 文件,不能是把 rar 的直接改为 zip 这样会出现java.io.IOException

	 * @param targetDir

	 *            存放的目錄

	 * @throws ZipException

	 * @throws IOException

	 */

	@SuppressWarnings("resource")

	public static void unZip(String sourceFile, String targetDir)

			throws ZipException, IOException {



		targetDir = targetDir.endsWith("//") ? targetDir : targetDir + "//";

		byte b[] = new byte[1024];

		ZipFile zipFile = null;

		BufferedOutputStream bos = null;

		zipFile = new ZipFile(new File(sourceFile));

		Enumeration<?> enumeration = zipFile.entries();



		while (enumeration.hasMoreElements()) {

			ZipEntry zipEntry = (ZipEntry) enumeration.nextElement();

			File loadFile = new File(targetDir + zipEntry.getName());



			if (!zipEntry.isDirectory()) {

				if (!loadFile.getParentFile().exists()) {

					loadFile.getParentFile().mkdirs();

				}

				OutputStream os = new FileOutputStream(loadFile);

				InputStream inputStream = zipFile.getInputStream(zipEntry);

				bos = new BufferedOutputStream(os);



				int length = 0;

				while ((length = inputStream.read(b)) > 0) {

					bos.write(b, 0, length);

				}

			}

		}

	}

}
最近工作利用了OSGi,需要在代码中手动生成jar包,也就是bundle,所以采用了这种技术去生成jar包。利用了zip压缩,将事先用eclipse生成的bundle的jar包解压出来,在向里面添加自己的文件,然后在压缩成jar。

 

你可能感兴趣的:(java)