Java压缩和解压文件工具类ZipUtil

来源:互联网 发布:快捷启动移动数据地址 编辑:程序博客网 时间:2024/05/17 19:57
 
1.  ZipUtil.java
 
package com.utility.zip;
importjava.io.BufferedInputStream;
importjava.io.BufferedOutputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.zip.ZipEntry;
importjava.util.zip.ZipInputStream;
importjava.util.zip.ZipOutputStream;
importcom.utility.io.IOUtil;
/**
* 通过Java的Zip输入输出流实现压缩和解压文件
* @author liujiduo
*/public final class ZipUtil {
    privatestatic byte[] buffer =new byte[1024* 10];
    privateZipUtil() {
        // empty     }
    /**
     * 压缩文件
    
     * @param filePath
     *            待压缩的文件路径
     * @return 压缩后的文件
     */
    publicstatic File zip(String filePath) {
        File target = null;
        File source = newFile(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 = newFileOutputStream(target);
               zos = newZipOutputStream(newBufferedOutputStream(fos));
               // 添加对应的文件Entry                 addEntry("/", source, zos);
            } catch (IOException e) {
               throw newRuntimeException(e);
            } finally {
               IOUtil.closeQuietly(zos, fos);
            }
        }
        return target;
    }
    /**
     * 扫描添加文件Entry
    
     * @param base
     *            基路径
    
     * @param source
     *            源文件
     * @param zos
     *            Zip文件输出流
     * @throws IOException
     */
    privatestatic 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 = newFileInputStream(source);
               bis = newBufferedInputStream(fis, buffer.length);
               int read = 0;
               zos.putNextEntry(newZipEntry(entry));
               while ((read = bis.read(buffer,0, buffer.length)) != -1) {
                   zos.write(buffer, 0, read);
               }
               zos.closeEntry();
            } finally {
               IOUtil.closeQuietly(bis, fis);
            }
        }
    }
    /**
     * 解压文件
    
     * @param filePath
     *            压缩文件路径
     */
    publicstatic void unzip(String filePath) {
        File source = newFile(filePath);
        if (source.exists()) {
            ZipInputStream zis = null;
            BufferedOutputStream bos = null;
            try {
               zis = newZipInputStream(newFileInputStream(source));
               ZipEntry entry = null;
               while ((entry = zis.getNextEntry()) !=null && !entry.isDirectory()) {
                   File target = newFile(source.getParent(), entry.getName());
                   if (!target.getParentFile().exists()) {
                       // 创建文件父目录                         target.getParentFile().mkdirs();
                   }
                   // 写入文件                     bos = new BufferedOutputStream(newFileOutputStream(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 newRuntimeException(e);
            } finally {
               IOUtil.closeQuietly(zis, bos);
            }
        }
    }
    publicstatic void main(String[] args) {
        String targetPath = "E:\\Win7壁纸";
        File file = ZipUtil.zip(targetPath);
        System.out.println(file);
        ZipUtil.unzip("F:\\Win7壁纸.zip");
    }
}
 
 
2. IOUtil.java
 
package com.utility.io;
importjava.io.Closeable; importjava.io.IOException;
/**
* IO流工具类
* @author liujiduo
*/public class IOUtil {
    /**
     * 关闭一个或多个流对象
    
     * @param closeables
     *            可关闭的流对象列表
     * @throws IOException
     */
    publicstatic void close(Closeable... closeables) throws IOException {
        if (closeables != null) {
            for (Closeable closeable : closeables) {
               if (closeable !=null) {
                   closeable.close();
               }
            }
        }
    }
    /**
     * 关闭一个或多个流对象
    
     * @param closeables
     *            可关闭的流对象列表
     */
    publicstatic void closeQuietly(Closeable... closeables) {
        try {
            close(closeables);
        } catch (IOException e) {
            // do nothing         }
    }
}
0 0
原创粉丝点击