做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载。Java的JDK中提供一个java.util.zip的接口,供大家使用。如下图:
图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的。
java.util.zip.ZipEntry;java.util.zip.ZipOutputStream;
下面的压缩过程主要是通过这两个接口压缩文件或者文件夹;
下面先给出源码,后面详细介绍的接口中的方法:
1 package ZIPUtil; 2 3 import java.io.BufferedInputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.IOException; 8 import java.util.zip.CRC32; 9 import java.util.zip.CheckedOutputStream; 10 import java.util.zip.ZipEntry; 11 import java.util.zip.ZipOutputStream; 12 13 /** 14 * 学习使用java.util.zip压缩文件或者文件夹 15 * @author lhm 16 * 17 */ 18 19 public class ZIPUtil { 20 21 /** 22 * @param args 主方法 23 */ 24 public static void main(String[] args) { 25 // TODO Auto-generated method stub 26 //第一个参数是需要压缩的源路径;第二个参数是压缩文件的目的路径,这边需要将压缩的文件名字加上去 27 compress("H:\\zip/scala","H:\\zip/oo.zip"); 28 } 29 30 /**s 31 * 压缩文件 32 * @param srcFilePath 压缩源路径 33 * @param destFilePath 压缩目的路径 34 */ 35 public static void compress(String srcFilePath, String destFilePath) { 36 // 37 File src = new File(srcFilePath); 38 39 if (!src.exists()) { 40 throw new RuntimeException(srcFilePath + "不存在"); 41 } 42 File zipFile = new File(destFilePath); 43 44 try { 45 46 FileOutputStream fos = new FileOutputStream(zipFile); 47 ZipOutputStream zos = new ZipOutputStream(fos); 48 String baseDir = ""; 49 compressbyType(src, zos, baseDir); 50 zos.close(); 51 52 } catch (Exception e) { 53 // TODO Auto-generated catch block 54 e.printStackTrace(); 55 56 } 57 } 58 /** 59 * 按照原路径的类型就行压缩。文件路径直接把文件压缩, 60 * @param src 61 * @param zos 62 * @param baseDir 63 */ 64 private static void compressbyType(File src, ZipOutputStream zos,String baseDir) { 65 66 if (!src.exists()) 67 return; 68 System.out.println("压缩路径" + baseDir + src.getName()); 69 //判断文件是否是文件,如果是文件调用compressFile方法,如果是路径,则调用compressDir方法; 70 if (src.isFile()) { 71 //src是文件,调用此方法 72 compressFile(src, zos, baseDir); 73 74 } else if (src.isDirectory()) { 75 //src是文件夹,调用此方法 76 compressDir(src, zos, baseDir); 77 78 } 79 80 } 81 82 /** 83 * 压缩文件 84 */ 85 private static void compressFile(File file, ZipOutputStream zos,String baseDir) { 86 if (!file.exists()) 87 return; 88 try { 89 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); 90 ZipEntry entry = new ZipEntry(baseDir + file.getName()); 91 zos.putNextEntry(entry); 92 int count; 93 byte[] buf = new byte[1024]; 94 while ((count = bis.read(buf)) != -1) { 95 zos.write(buf, 0, count); 96 } 97 bis.close(); 98 99 } catch (Exception e) {100 // TODO: handle exception101 102 }103 }104 105 /**106 * 压缩文件夹107 */108 private static void compressDir(File dir, ZipOutputStream zos,String baseDir) {109 if (!dir.exists())110 return;111 File[] files = dir.listFiles();112 if(files.length == 0){113 try {114 zos.putNextEntry(new ZipEntry(baseDir + dir.getName()+File.separator));115 } catch (IOException e) {116 e.printStackTrace();117 }118 }119 for (File file : files) {120 compressbyType(file, zos, baseDir + dir.getName() + File.separator);121 }122 }123 }
先将文件加载到文件流FileInputStream中,再将文件流输入到ZipOutputStream;
源文件路径:H:\\zip/scala,目的压缩文件zip的路径:H:\\zip/oo.zip
文章转自:https://www.cnblogs.com/lihaiming93/p/8098255.html