Java压缩文件工具类ZipUtil使用方法代码示例

 更新时间:2017年11月29日 10:50:46   作者:mao2080  
这篇文章主要介绍了Java压缩文件工具类ZipUtil使用方法代码示例,具有一定借鉴价值,需要的朋友可以参考下。

本文实例通过Java的Zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下:

package com.utility.zip;
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.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import com.utility.io.IOUtil;
/**
 * 通过Java的Zip输入输出流实现压缩和解压文件
 * 
 * @author liujiduo
 * 
 */
public final class ZipUtil {
	private ZipUtil() {
		// empty
	}
	/**
   * 压缩文件
   * 
   * @param filePath
   *      待压缩的文件路径
   * @return 压缩后的文件
   */
	public static File zip(String filePath) {
		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 {
				IOUtil.closeQuietly(zos, fos);
			}
		}
		return target;
	}
	/**
   * 扫描添加文件Entry
   * 
   * @param base
   *      基路径
   * 
   * @param source
   *      源文件
   * @param zos
   *      Zip文件输出流
   * @throws IOException
   */
	private static void addEntry(String base, File source, ZipOutputStream zos)
	      throws IOException {
		// 按目录分级,形如:/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;
			try {
				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();
			}
			finally {
				IOUtil.closeQuietly(bis, fis);
			}
		}
	}
	/**
   * 解压文件
   * 
   * @param filePath
   *      压缩文件路径
   */
	public static void unzip(String filePath) {
		File source = new File(filePath);
		if (source.exists()) {
			ZipInputStream zis = null;
			BufferedOutputStream bos = null;
			try {
				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();
			}
			catch (IOException e) {
				throw new RuntimeException(e);
			}
			finally {
				IOUtil.closeQuietly(zis, bos);
			}
		}
	}
	public static void main(String[] args) {
		String targetPath = "E:\\Win7壁纸";
		File file = ZipUtil.zip(targetPath);
		System.out.println(file);
		ZipUtil.unzip("F:\\Win7壁纸.zip");
	}
}

下面是通过IO流工具类实现关闭一个或多个流对象的Java语言描述,获取可关闭的流对象列表,具体如下:

package com.utility.io;
import java.io.Closeable;
import java.io.IOException;
/**
 * IO流工具类
 * 
 * @author liujiduo
 * 
 */
public class IOUtil {
	/**
   * 关闭一个或多个流对象
   * 
   * @param closeables
   *      可关闭的流对象列表
   * @throws IOException
   */
	public static void close(Closeable... closeables) throws IOException {
		if (closeables != null) {
			for (Closeable closeable : closeables) {
				if (closeable != null) {
					closeable.close();
				}
			}
		}
	}
	/**
   * 关闭一个或多个流对象
   * 
   * @param closeables
   *      可关闭的流对象列表
   */
	public static void closeQuietly(Closeable... closeables) {
		try {
			close(closeables);
		}
		catch (IOException e) {
			// do nothing
		}
	}
}

总结

以上就是本文关于Java压缩文件工具类ZipUtil使用方法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。

相关文章

  • JAVA多线程的使用场景与注意事项总结

    JAVA多线程的使用场景与注意事项总结

    这篇文章主要给大家介绍了关于JAVA多线程的使用场景与注意事项的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • mybatis xml文件热加载实现示例详解

    mybatis xml文件热加载实现示例详解

    这篇文章主要为大家介绍了mybatis xml文件热加载实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • SpringBoot如何通过Map实现策略模式

    SpringBoot如何通过Map实现策略模式

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这篇文章主要介绍了SpringBoot如何通过Map实现策略模式,需要的朋友可以参考下
    2025-03-03
  • java 导入Excel思路及代码示例

    java 导入Excel思路及代码示例

    这篇文章主要介绍了java 导入Excel思路及代码示例,简要分析了设计思路,然后分享了实例代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java结构型设计模式中代理模式示例详解

    Java结构型设计模式中代理模式示例详解

    代理模式(Proxy Parttern)为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象。本文将通过示例详细讲解一下这个模式,需要的可以参考一下
    2022-09-09
  • Java中的线程死锁是什么?如何避免?

    Java中的线程死锁是什么?如何避免?

    这篇文章主要介绍了Java中线程死锁的相关资料,以及避免死锁的方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-09-09
  • 详解HDFS多文件Join操作的实例

    详解HDFS多文件Join操作的实例

    这篇文章主要介绍了详解HDFS多文件Join操作的实例的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • java 集合并发操作出现的异常ConcurrentModificationException

    java 集合并发操作出现的异常ConcurrentModificationException

    Map在遍历时候通常 现获得其键值的集合Set,然后用迭代器Iterator来对Map进行遍历。
    2009-06-06
  • Java线程实现的两种方式解析

    Java线程实现的两种方式解析

    这篇文章主要介绍了Java线程实现的两种方式解析,注意在构造器中启动这个线程的话,很容易造成this逃逸的问题,这是要注意的,这是通过直接集成thread来成为线程,同时在这种情况下,你可以通过调用合适的方法来,需要的朋友可以参考下
    2024-01-01
  • jmeter中json提取器如何提取多个参数值

    jmeter中json提取器如何提取多个参数值

    关于jmeter中的正则表达式及json提取器可以提取响应值,但是实际可以需要上个接口的多个响应值,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-11-11

最新评论