Java 压缩zip格式文件

三个主要的类:

  • import java.util.zip.ZipFile;//打开zip格式文件。
  • import java.util.zip.ZipEntry; //标记被压缩文件的属性,主要是文件名和路径。
  • import java.util.zip.ZipOutputStream;//zip格式输出流。

压缩文件夹时,需要挨个结点,递归压缩文件夹中所有的文件。

	public static void zipFile(String filePath, String zipPath) {
		try {
			File inFile = new File(filePath);
			File outFile = new File(zipPath);
			FileOutputStream fos = new FileOutputStream(outFile);
			ZipOutputStream zos = new ZipOutputStream(fos);
			zipFile(filePath, inFile, zos);
			zos.close();
			fos.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 压缩文件夹
	 * @date 2016年4月13日 下午7:47:11
	 * @param folderPath
	 * @param zipPath
	 */
	public static void zipFolder(String folderPath, String zipPath) {

		try {
			File inFile = new File(folderPath);
			File outFile = new File(zipPath);
			FileOutputStream fos = new FileOutputStream(outFile);
			ZipOutputStream zos = new ZipOutputStream(fos);
			zipFile(folderPath, inFile, zos);
			zos.close();
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 递归压缩文件
	 * @date 2016年4月13日 下午7:47:28
	 * @param folderPath
	 * @param file
	 * @param zos
	 */
	private static void zipFile(String folderPath, File file, ZipOutputStream zos) {

		int index = folderPath.lastIndexOf(File.separator);
		
		try {
			if (file.isDirectory()) {// 文件夹,递归遍历文件夹下文件压缩
				File[] files = file.listFiles();
				if (files != null) {
					for (File f : files)
						zipFile(folderPath, f, zos);
				}
				return;
			}
			zos.putNextEntry(new ZipEntry(file.getAbsolutePath().substring(index)));
			byte[] buffer = new byte[1024];
			int length = -1;
			FileInputStream fis = new FileInputStream(file);
			while ((length = fis.read(buffer)) != -1) {
				zos.write(buffer, 0, length);
			}
			fis.close();

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

	}

	/**
	 * 解压文件.zip格式
	 * 
	 * @date 2016年4月13日 下午3:12:23
	 * @param zipFilePath
	 * @param outFolderPath
	 */
	public static void unzipFile(String zipFilePath, String outFolderPath) {

		try {
			ZipFile zipFile = new ZipFile(zipFilePath);

			Enumeration<ZipEntry> zList = (Enumeration<ZipEntry>) zipFile.entries();
			while (zList.hasMoreElements()) {
				ZipEntry zipEntry = zList.nextElement();
				if (zipEntry.getName().startsWith("__MACOSX"))// Mac
																// 系统自带压缩工具生成,屏蔽
					continue;
				if (!zipEntry.isDirectory()) {// 只解压文件
					InputStream is = zipFile.getInputStream(zipEntry);
					StringBuffer name = new StringBuffer(outFolderPath);
					if (name.lastIndexOf(File.separator) != name.length() - 1) {
						name.append(File.separator);
					}
					name.append(zipEntry.getName());
					File outFile = new File(name.toString());
					if (!outFile.getParentFile().exists())
						outFile.getParentFile().mkdirs();
					outFile.createNewFile();
					FileOutputStream fos = new FileOutputStream(outFile);
					int length = -1;
					byte[] buffer = new byte[1024];
					while ((length = is.read(buffer)) != -1) {
						fos.write(buffer, 0, length);
					}
					// 关闭流
					is.close();
					fos.close();
				}

			}
			zipFile.close();

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值