账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    解压zip中压缩包小于10kb的文件进度值计算问题
    44
    0
    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解压进度显示,可是当遇到小文件时,进度更新速度太快,无法看清楚解压缩的具体哪个文件了,我想如何让小文件 进度值更新的慢一些

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    网站公告
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部