欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-26 14:56:58
本文实例通过java的zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下: package com.utility.z...

本文实例通过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使用方法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。