Java学习之使用net.lingala.zip4j.core.ZipFile解压缩文件,带解压缩进度

时间:2022-05-30 11:55:32

点击下载 net.lingala.zip4j.core.ZipFile

import java.io.File;  import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.progress.ProgressMonitor;  public class Zip4jTest001 {

    /**  * 进度接口  *  * @author lzy  *  */  public interface ProgressListener {
        void onStart();   void onProgress(long progress);   void onError(Exception e);   void onCompleted();  }

    /**  * @param args  */  public static void main(String[] args) {
        try {
            unZipFileWithProgress("C:\\Users\\lzy\\Desktop\\www.zip", "C:\\Users\\lzy\\Desktop\\www", "123456",  new Zip4jTest001.ProgressListener() {

                        @Override  public void onStart() {
                            System.out.println("--onStart--");  }

                        @Override  public void onProgress(long progress) {
                            System.out.println("--onProgress--" + progress);  }

                        @Override  public void onError(Exception e) {
                            System.out.println("--onCompleted--" + e.getMessage());  }

                        @Override  public void onCompleted() {
                            System.out.println("--onCompleted--");  }
                    }, false);  } catch (Exception e) {
            e.printStackTrace();  }
    }

    /**  * 解压缩zip,带解压进度  *  * @param zipFilePath  * @param filePath  * @param password  * @param listener  * @param isDeleteZip  * @throws ZipException  */  public static void unZipFileWithProgress(final String zipFilePath, final String filePath, final String password,  final ProgressListener listener, final boolean isDeleteZip) throws ZipException {

        final File zipFile = new File(zipFilePath);   ZipFile zFile = new ZipFile(zipFile);  zFile.setFileNameCharset("utf-8");   if (!zFile.isValidZipFile()) { //  throw new ZipException("exception!");  }
        File destDir = new File(filePath);  if (destDir.isDirectory() && !destDir.exists()) {
            destDir.mkdir();  }
        if (zFile.isEncrypted()) {
            zFile.setPassword(password); // 设置解压密码  }

        final ProgressMonitor progressMonitor = zFile.getProgressMonitor();  Thread thread = new Thread(new Runnable() {
            @Override  public void run() {
                try {
                    int precentDone = 0;  if (listener == null) {
                        return;  }
                    listener.onStart();  while (true && !progressMonitor.isCancelAllTasks()) {
                        // 每隔50ms,发送一个解压进度出去  Thread.sleep(50);  precentDone = progressMonitor.getPercentDone();  listener.onProgress(precentDone);  if (precentDone >= 100) {
                            break;  }
                    }
                    listener.onCompleted();  } catch (InterruptedException e) {
                    listener.onError(e);  } finally {
                    if (isDeleteZip) {
                        zipFile.delete();// 将原压缩文件删除  }
                }
            }
        });  thread.start();   zFile.setRunInThread(false); // true 在子线程中进行解压 , false主线程中解压  try {
            zFile.extractAll(filePath); // 将压缩文件解压到filePath...  } catch (Exception e) {
            progressMonitor.cancelAllTasks();  listener.onError(e);  }
    }
}