博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
文件或文件夹压缩工具类
阅读量:5111 次
发布时间:2019-06-13

本文共 2211 字,大约阅读时间需要 7 分钟。

import java.io.File;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.LinkedList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 *
 * 实现将文件或文件夹压缩为zip格式的文件
 * @author 周瑜
 * @2018年5月19日 下午3:49:04
 */
public class ZipUtils {
    /**
     * 设置压缩过程中字节数组的大小
     */
    private static final int BUFFER_SIZE = 1024*1024;
    /**
     * 压缩多个文件或文件夹,到指定输出流中
     * @param srcFiles
     *            需要压缩的文件列表
     * @param out
     *            压缩文件输出流
     */
    public static void toZip(OutputStream out,String... filePaths) {
        try (ZipOutputStream zos = new ZipOutputStream(out)) {
            long start = System.currentTimeMillis();
            for (String srcFile : filePaths) {
                compress(new File(srcFile), zos);
            }
            System.out.println("压缩完成,耗时:" + (System.currentTimeMillis() - start) + " ms");
        } catch (Exception e) {
            System.err.println("压缩失败!");
            e.printStackTrace();
        }
    }
    /**
     *
     * 使用文件队列的方式压缩文件和文件夹
     * @param file
     *            源文件
     * @param zos
     *            zip输出流
     */
    private static void compress(File file,ZipOutputStream zos) {
        String rootPath = file.getAbsolutePath();
        String rootName = file.getName();
        byte[] byts = new byte[BUFFER_SIZE];
        LinkedList<File> list = new LinkedList<>();
        list.addFirst(file);
        while(!list.isEmpty()) {
            File srcFile = list.removeLast();
            String name = srcFile.getAbsolutePath().replace(rootPath, rootName);
            if (srcFile.isFile()) {
                try (FileInputStream input = new FileInputStream(srcFile);) {
                    // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
                    zos.putNextEntry(new ZipEntry(name));
                    int len = 0;
                    while ((len = input.read(byts)) != -1) {
                        zos.write(byts, 0, len);
                    }
                    zos.closeEntry();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                File[] listFiles = srcFile.listFiles();
                if (listFiles == null || listFiles.length == 0) {
                    // 空文件夹的处理
                    try {
                        zos.putNextEntry(new ZipEntry(name + "/"));
                        // 没有文件,不需要文件的copy
                        zos.closeEntry();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    for (File sonFile : listFiles) {
                        list.addFirst(sonFile);
                    }
                }
            }
        }
    }
    /**
     * 测试压缩方法
     */
    public static void main(String[] args) throws Exception {
        FileOutputStream fos2 = new FileOutputStream(new File("F:\\pic\\2.zip"));
        ZipUtils.toZip(fos2,"F:\\pic\\1.jpg","F:\\pic\\2.jpg");
    }
}

转载于:https://www.cnblogs.com/zhou-yu/p/9293967.html

你可能感兴趣的文章
hello,world!
查看>>
学习web前端开发感想
查看>>
百度地图API,定位您的当前位置
查看>>
写一个jquery弹出层插件gbox,简单多功能...
查看>>
JavaScript的一些CheckData函数
查看>>
JSP 手记
查看>>
df和du显示的磁盘空间使用情况不一致的原因及处理
查看>>
[无关] 胡言乱语3
查看>>
Leetcode 29. Divide Two Integers
查看>>
thinkPHP--SQL查询
查看>>
winrar 弹窗处理
查看>>
关于IO流的抽象类
查看>>
2019.1.26
查看>>
伪静态的实现方法:IIS环境下配置
查看>>
Selenium-webdriver系列教程(三)————如何执行一段js脚本
查看>>
使用debussy完成自动仿真
查看>>
MyEclipse中Web项目的发布和运行
查看>>
【模板】最短路
查看>>
理解 Lua 的那些坑爹特性
查看>>
Windows WMIC命令使用详解(附实例)
查看>>