Java压缩文件/文件夹

  • Post author:
  • Post category:java



ZipOutputStream流、递归压缩。

在关闭ZipOutputStream流之前,需要先调用flush()方法,强制将缓冲区所有的数据输出,以避免解压文件时出现压缩文件已损坏的现象。

/**
 * @param source    待压缩文件/文件夹路径
 * @param destination   压缩后压缩文件路径
 * @return
 */
public static boolean toZip(String source, String destination) {
    try {
        FileOutputStream out = new FileOutputStream(destination);
        ZipOutputStream zipOutputStream = new ZipOutputStream(out);
        File sourceFile = new File(source);

        // 递归压缩文件夹
        compress(sourceFile, zipOutputStream, sourceFile.getName());

        zipOutputStream.flush();
        zipOutputStream.close();
    } catch (IOException e) {
        System.out.println("failed to zip compress, exception");
        return false;
    }
    return true;
}

private static void compress(File sourceFile, ZipOutputStream zos, String name) throws IOException {
    byte[] buf = new byte[1024];
    if(sourceFile.isFile()){
        // 压缩单个文件,压缩后文件名为当前文件名
        zos.putNextEntry(new ZipEntry(name));
        // copy文件到zip输出流中
        int len;
        FileInputStream in = new FileInputStream(sourceFile);
        while ((len = in.read(buf)) != -1){
            zos.write(buf, 0, len);
        }
        zos.closeEntry();
        in.close();
    } else {
        File[] listFiles = sourceFile.listFiles();
        if(listFiles == null || listFiles.length == 0){
            // 空文件夹的处理(创建一个空ZipEntry)
            zos.putNextEntry(new ZipEntry(name + "/"));
            zos.closeEntry();
        }else {
            // 递归压缩文件夹下的文件
            for (File file : listFiles) {
                compress(file, zos, name + "/" + file.getName());
            }
        }
    }
}



版权声明:本文为weixin_37672801原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。