- 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;
- /**
- * 通过Java的Zip输入输出流实现压缩和解压文件
- *
- * @author liujiduo
- *
- */
- public final class ZipUtil {
- private static byte[] buffer = new byte[1024 * 10];
- 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 {
- 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;
- 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");
- }
- }
- 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
- }
- }
- }
来源: http://www.phpxs.com/code/1001770/