zip文件解压

private static String unZipToFile(File file ,File outfiledir,String charsetName) {
        //获取文件名称
        String filename = file.getName();

        FileOutputStream out = null;
        InputStream in = null;
        ZipFile zipFileData = null;
        ZipFile zipFile = null;
        try {
            //设置若设定有编码方式则使用,否则使用默认utf-8
            if (charsetName != null && charsetName != "") {
                zipFile = new ZipFile(file.getPath(), Charset.forName(charsetName));
            } else {
                zipFile = new ZipFile(file.getPath(), Charset.forName("utf8"));
            }
            //压缩包内容
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            //处理创建文件夹
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();
                String filePath = "";
                //获取压缩文件的第一层目录名称
                String parentDir = entry.getName().substring(0, entry.getName().indexOf("/"));

                //若目标文件夹为空,则默认保存在压缩包所在文件夹,若存在,保存在目标文件夹
                if (outfiledir == null) {
                    //更改一层文件夹名称
                    filePath = file.getParentFile().getPath() + File.separator + entry.getName().replace(parentDir,filename.substring(0, filename.length() - 4));
                    //无需更改一层文件夹名称
                    //filePath = file.getParentFile().getPath() + File.separator + entry.getName();
                } else {
                    //更改一层文件夹名称
                    filePath = outfiledir.getPath() + File.separator + entry.getName().replace(parentDir, filename.substring(0, filename.length() - 4));
                    //无需更改一层文件夹名称
                    //filePath = outfiledir.getPath() + File.separator + entry.getName();
                }
                System.out.println(filePath);

                File f = new File(filePath);
                /**
                 * 创建文件夹路径
                 */
                File parentFile = f.getParentFile();
                if (!parentFile.exists()) {
                    parentFile.mkdirs();
                }
            }
            /**
             * 创建文件内容,如果是文件夹进行下一循环,若是文件进行读写
             */
            if (charsetName != null && charsetName != "") {
                zipFileData = new ZipFile(file.getPath(), Charset.forName(charsetName));
            } else {
                zipFileData = new ZipFile(file.getPath(), Charset.forName("utf8"));
            }
            Enumeration<? extends ZipEntry> entriesData = zipFileData.entries();

            while (entriesData.hasMoreElements()) {
                ZipEntry entry = entriesData.nextElement();
                in = zipFile.getInputStream(entry);
                String filePath = "";
                //获取压缩文件的第一层目录名称
                String parentDir = entry.getName().substring(0, entry.getName().indexOf("/"));
                //若目标文件夹为空,则默认保存在压缩包所在文件夹,若存在,保存在目标文件夹
                if (outfiledir == null) {
                    //更改一层文件夹名称
                    filePath = file.getParentFile().getPath() + File.separator + entry.getName().replace(parentDir, filename.substring(0, filename.length() - 4));
                    //无需更改一层文件夹名称
                    //filePath = file.getParentFile().getPath() + File.separator + entry.getName();
                } else {
                    //更改一层文件夹名称
                    filePath = outfiledir.getPath() + File.separator + entry.getName().replace(parentDir, filename.substring(0, filename.length() - 4));
                    //无需更改一层文件夹名称
                    //filePath = outfiledir.getPath() + File.separator + entry.getName();
                }
                File f = new File(filePath);
                if (f.isDirectory()) {
                    continue;
                }
                out = new FileOutputStream(filePath);
                int len = -1;
                byte[] bytes = new byte[1024];
                while ((len = in.read(bytes)) != -1) {
                    out.write(bytes, 0, len);
                }
                out.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "error";
        } finally {
            try {
                out.close();
                in.close();
                zipFile.close();
                zipFileData.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return "success";
        }
    }
posted @ 2022-10-30 23:22  寒小韩  阅读(170)  评论(0编辑  收藏  举报