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); } }
参考链接: