鍍金池/ 問(wèn)答/Java  Android/ 解壓zip中壓縮包小于10kb的文件進(jìn)度值計(jì)算問(wèn)題

解壓zip中壓縮包小于10kb的文件進(jìn)度值計(jì)算問(wèn)題

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;
            // 獲取解壓之后文件的大小,用來(lái)計(jì)算解壓的進(jìn)度
            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();
            }
        }

    }

    /**
     *  解壓?jiǎn)蝹€(gè)文件
     * @param zipEntry          解壓的單個(gè)文件
     * @param outPathString     解壓保存路徑
     * @param inZip             zip 輸入流
     * @param out               zip 輸出流
     * @param sumTotalLength    解壓 總長(zhǎng)度
     * @param ziplength         zip 總長(zhǎng)度
     * @param unZipListener     監(jiān)聽(tīng)回調(diào)
     * @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時(shí)Ui只更新一次
            boolean isUpdateProgress = false;

            // 讀取(字節(jié))字節(jié)到緩沖區(qū)
            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 + " 讀取長(zhǎng)度:" + len + " ,進(jìn)度值:" + curProgress + " ,總進(jìn)度:" + totalProgress + " ,總長(zhǎng)度:" + fileSize);

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


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

                // 從緩沖區(qū)(0)位置寫入(字節(jié))字節(jié)
                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);
    }
}

我現(xiàn)在其實(shí)已經(jīng)實(shí)現(xiàn)了,zip解壓進(jìn)度顯示,可是當(dāng)遇到小文件時(shí),進(jìn)度更新速度太快,無(wú)法看清楚解壓縮的具體哪個(gè)文件了,我想如何讓小文件 進(jìn)度值更新的慢一些

回答
編輯回答
祈歡

信息放 list里,就能看到了

2018年3月21日 22:10
編輯回答
悶騷型

解壓完一個(gè)文件暫停一秒,都能看清了

2017年8月21日 20:13