解压zip中压缩包小于10kb的文件进度值计算问题

冰冰的冻结
  • 519
public class ZipUtils {
    public static final String TAG = "ZIP";

    public ZipUtils() {

    }

    /**
     * 解压zip到指定的路径
     *
     * @param zipFileString ZIP的名称
     * @param outPathString 要解压缩路径
     * @throws Exception
     */
    public void UnZipFolder(String zipFileString, String outPathString,UnZipListener unZipListener) {
        ZipInputStream inZip = null;
        FileOutputStream out = null;
        try {
            inZip= new ZipInputStream(new FileInputStream(zipFileString));
            ZipEntry zipEntry;

            long sumTotalLength = 0;
            // 获取解压之后文件的大小,用来计算解压的进度
            long ziplength = getZipTrueSize(zipFileString);
            System.out.println("压缩包大小:" + ziplength);

            while ((zipEntry = inZip.getNextEntry()) != null) {
                sumTotalLength = unZipFile(zipEntry, outPathString, inZip, out, sumTotalLength, ziplength, unZipListener);
            }
            inZip.close();
            if(unZipListener!=null)
                unZipListener.onSuccess();
        } catch (Exception e) {
            e.printStackTrace();
            if(unZipListener!=null){
                unZipListener.onError(e.getMessage());
            }
            try {
                if(inZip!=null)
                inZip.close();
            } catch (Exception e1) {
                e1.printStackTrace();
            }
            try {
                if(out!=null)
                    out.close();
            } catch (IOException e1) {
                e1.printStackTrace();
            }
        }

    }

    /**
     *  解压单个文件
     * @param zipEntry          解压的单个文件
     * @param outPathString     解压保存路径
     * @param inZip             zip 输入流
     * @param out               zip 输出流
     * @param sumTotalLength    解压 总长度
     * @param ziplength         zip 总长度
     * @param unZipListener     监听回调
     * @throws IOException
     */
    private long unZipFile(ZipEntry zipEntry, String outPathString, ZipInputStream inZip, FileOutputStream out,
                           long sumTotalLength, long ziplength, UnZipListener unZipListener) throws IOException {


        System.out.println("\r");
        System.out.println("\r");
        System.out.println("\r");

        String szName = zipEntry.getName();
        if (zipEntry.isDirectory()) {
            //获取部件的文件夹名
            szName = szName.substring(0, szName.length() - 1);
            File folder = new File(outPathString + File.separator + szName);
            folder.mkdirs();
        } else {
//            System.out.println("读取文件:" + outPathString + File.separator + szName);

            File file = new File(outPathString + File.separator + szName);
            if (!file.exists()) {
//                        Log.e(TAG, "Create the file:" + outPathString + File.separator + szName);
                file.getParentFile().mkdirs();
                file.createNewFile();
            }

            long fileSize = zipEntry.getSize();
            // 获取文件的输出流
            out= new FileOutputStream(file);
            int len;
            byte[] buffer = new byte[1024];
            long sumLength = 0;
            long lastCurProgress = 0;

            //如果zip包大小为0时Ui只更新一次
            boolean isUpdateProgress = false;

            // 读取(字节)字节到缓冲区
            while ((len = inZip.read(buffer)) != -1) {
                if (unZipListener != null) {
                    if (ziplength != 0) {

                        sumLength += len;
                        sumTotalLength += len;
                        int totalProgress = (int) ((sumTotalLength * 100) / ziplength);

                        int curProgress;
                        if (fileSize != 0) {
                            curProgress = (int) ((sumLength * 100) / fileSize);
                            System.out.println("文件:" + szName + " 读取长度:" + len + " ,进度值:" + curProgress + " ,总进度:" + totalProgress + " ,总长度:" + fileSize);

                            if (fileSize < 1024 * 100) {
                                if (curProgress > 10) {
                                    unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
                                }
//                                if (curProgress > lastCurProgress) { //避免重复刷新UI
//                                    lastCurProgress = curProgress;
//
//                                }


                            } else {
                                if (curProgress > lastCurProgress) { //避免重复刷新UI
                                    lastCurProgress = curProgress;
//                                    unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
                                }
                            }
                        } else {
                            curProgress = 100;
                            if (curProgress > lastCurProgress) { //避免重复刷新UI
                                lastCurProgress = curProgress;
//                                unZipListener.onUnZipFileProgress(szName, curProgress, totalProgress);
                            }
                        }
                    } else {
                        if (!isUpdateProgress) {
                            unZipListener.onUnZipFileProgress(szName, 100, 100);
                            isUpdateProgress = true;
                        }
                    }
                }

                // 从缓冲区(0)位置写入(字节)字节
                out.write(buffer, 0, len);
                out.flush();
            }
            out.close();
        }
        return sumTotalLength;
    }


    /**
     * 获取zip 压缩包大小
     * @param filePath  文件路径
     * @return          文件大小
     */
    public long getZipTrueSize(String filePath) {
        long size = 0;
        ZipFile f;
        try {
            f = new ZipFile(filePath);
            Enumeration<? extends ZipEntry> en = f.entries();
            while (en.hasMoreElements()) {
                size += en.nextElement().getSize();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return size;
    }


    public interface UnZipListener {
        void onSuccess();
        void onError(String reason);
        void onUnZipFileProgress(String name, int progress, int totalProgress);
    }
}

我现在其实已经实现了,zip解压进度显示,可是当遇到小文件时,进度更新速度太快,无法看清楚解压缩的具体哪个文件了,我想如何让小文件 进度值更新的慢一些

回复
阅读 1.9k
2 个回答

信息放 list里,就能看到了

解压完一个文件暂停一秒,都能看清了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏