Java压缩和解压文件工具类ZipUtil详解编程语言

用于服务器端打包文件的,将压缩后的文件写入到response输出流即可实现在服务器端打包下载,支持多级目录嵌套。

测试时可以先用ZipUtil.zip压缩某个文件夹test,得到压缩文件test.zip,然后将文件夹test删除,用ZipUtil.unzip解压test.zip即可还原。

PS:需要解决中文乱码的朋友可以参考此处 http://log-cd.iteye.com/blog/585647

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 
        } 
    } 
  
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/10301.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论