Android压缩文件列表为ZIP格式

import android.os.Environment;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtil {
    // 线程池
    private static final ExecutorService ThreadPool = Executors.newCachedThreadPool();

    /**
     * 压缩文件列表到SD
     *
     * @param fileName 压缩文件名称
     * @param pathList 要压缩的文件路径列表
     * @param callback 回调
     */
    public static void ZipFilesToSD(String fileName, List<String> pathList, ZipCallback callback) {
        String zipFilePath = Environment.getExternalStorageDirectory() + File.separator + fileName;
        ZipFiles(zipFilePath, pathList, callback);
    }

    /**
     * 压缩文件列表
     *
     * @param zipFilePath 压缩文件保存路径
     * @param pathList    要压缩的文件路径列表
     * @param callback    回调
     */
    public static void ZipFiles(final String zipFilePath, final List<String> pathList, final ZipCallback callback) {
        ThreadPool.execute(new Runnable() {
            @Override
            public void run() {
                try {
                    ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFilePath));
                    for (String path : pathList) {
                        File file = new File(path);
                        ZipEntry zipEntry = new ZipEntry(file.getParentFile().getName() + File.separator + file.getName());
                        FileInputStream inputStream = new FileInputStream(file);
                        outZip.putNextEntry(zipEntry);
                        int len;
                        byte[] buffer = new byte[4096];
                        while ((len = inputStream.read(buffer)) != -1) {
                            outZip.write(buffer, 0, len);
                        }
                        outZip.closeEntry();
                    }
                    outZip.finish();
                    outZip.close();
                    callback.onSuccess(zipFilePath);
                } catch (IOException e) {
                    e.printStackTrace();
                    callback.onFailed(e);
                }
            }
        });
    }

    /**
     * 回调接口
     */
    public interface ZipCallback {
        void onSuccess(String zipFilePath);

        void onFailed(Exception e);
    }
}

参考链接:

Android文件或文件夹压缩成.zip格式的压缩包

发表评论