做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载。Java的JDK中提供一个java.util.zip的接口,供大家使用。如下图:
图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的。
java.util.zip.ZipEntry;
java.util.zip.ZipOutputStream;
下面的压缩过程主要是通过这两个接口压缩文件或者文件夹;
下面先给出源码,后面详细介绍的接口中的方法:
package ZIPUtil; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.CRC32; import java.util.zip.CheckedOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 学习使用java.util.zip压缩文件或者文件夹 * @author lhm * */ public class ZIPUtil { /** * @param args 主方法 */ public static void main(String[] args) { // TODO Auto-generated method stub //第一个参数是需要压缩的源路径;第二个参数是压缩文件的目的路径,这边需要将压缩的文件名字加上去 compress("H:\\zip/scala","H:\\zip/oo.zip"); } /**s * 压缩文件 * @param srcFilePath 压缩源路径 * @param destFilePath 压缩目的路径 */ public static void compress(String srcFilePath, String destFilePath) { // File src = new File(srcFilePath); if (!src.exists()) { throw new RuntimeException(srcFilePath + "不存在"); } File zipFile = new File(destFilePath); try { FileOutputStream fos = new FileOutputStream(zipFile); ZipOutputStream zos = new ZipOutputStream(fos); String baseDir = ""; compressbyType(src, zos, baseDir); zos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 按照原路径的类型就行压缩。文件路径直接把文件压缩, * @param src * @param zos * @param baseDir */ private static void compressbyType(File src, ZipOutputStream zos,String baseDir) { if (!src.exists()) return; System.out.println("压缩路径" + baseDir + src.getName()); //判断文件是否是文件,如果是文件调用compressFile方法,如果是路径,则调用compressDir方法; if (src.isFile()) { //src是文件,调用此方法 compressFile(src, zos, baseDir); } else if (src.isDirectory()) { //src是文件夹,调用此方法 compressDir(src, zos, baseDir); } } /** * 压缩文件 */ private static void compressFile(File file, ZipOutputStream zos,String baseDir) { if (!file.exists()) return; try { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ZipEntry entry = new ZipEntry(baseDir + file.getName()); zos.putNextEntry(entry); int count; byte[] buf = new byte[1024]; while ((count = bis.read(buf)) != -1) { zos.write(buf, 0, count); } bis.close(); } catch (Exception e) { // TODO: handle exception } } /** * 压缩文件夹 */ private static void compressDir(File dir, ZipOutputStream zos,String baseDir) { if (!dir.exists()) return; File[] files = dir.listFiles(); if(files.length == 0){ try { zos.putNextEntry(new ZipEntry(baseDir + dir.getName()+File.separator)); } catch (IOException e) { e.printStackTrace(); } } for (File file : files) { compressbyType(file, zos, baseDir + dir.getName() + File.separator); } } }
java.util.zip-压缩流程:
先将文件加载到文件流FileInputStream中,再将文件流输入到ZipOutputStream;
源文件路径:H:\\zip/scala,目的压缩文件zip的路径:H:\\zip/oo.zip