Java实现解压缩ZIP

Java实现解压缩ZIP

1、MultipartFile 转为File工具类

@Component
public class MultipartFileToFile {
    public File ultipartFileToFile(MultipartFile file) throws Exception {
        File toFile = null;
        if (file.equals("") || file.getSize() <= 0) {
            file = null;
        } else {
            InputStream ins = null;
            ins = file.getInputStream();
            toFile = new File(file.getOriginalFilename());
            inputStreamToFile(ins, toFile);
            ins.close();
        }
        return toFile;
    }

    //获取流文件
    private static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2、获取压缩文件中的全部文件名称

 @Resource
    private MultipartFileToFile multipartFileToFile;

    /**
     * 获取压缩文件中的全部文件名称
     * @param multipartFile
     * @return List
     */
    @PostMapping("getFileName")
    public R getFileName(MultipartFile multipartFile){
        //创建List,存放获取的文件名称
        List<String> list = new ArrayList<>();
        File file=null;
        try {
            //将MultipartFile转化为File
            file = multipartFileToFile.ultipartFileToFile(multipartFile);
            //创建ZipFile对象,解析file文件
            ZipFile zipFile = new ZipFile(file);
            //获取压缩文件中的文件个数
            int size = zipFile.size();
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                list.add(entries.nextElement().getName());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(list);
        return R.ok().data("list",list);
    }

3、解压文件到指定目录

/**
     * 解压文件到指定目录
     * @param multipartFile
     * @return success/error
     */
    @PostMapping("decmpressionFile")
    public R decmpression(MultipartFile multipartFile){
        //指定压缩文件存放路径(最后一个/不能少)
        String descDir="F://online-education/";
        File Zipfile=null;
        try {
            //将MultipartFile转化为File
            Zipfile = multipartFileToFile.ultipartFileToFile(multipartFile);
            File pathFile = new File(descDir);
            if(!pathFile.exists())
            {
                pathFile.mkdirs();
            }
            //解决zip文件中有中文目录或者中文文件
            ZipFile zip = new ZipFile(Zipfile, Charset.forName("GBK"));
            for(Enumeration entries = zip.entries(); entries.hasMoreElements();)
            {
                ZipEntry entry = (ZipEntry)entries.nextElement();
                String zipEntryName = entry.getName();
                InputStream in = zip.getInputStream(entry);
                String outPath = (descDir+zipEntryName).replaceAll("\\*", "/");;
                //判断路径是否存在,不存在则创建文件路径
                File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
                if(!file.exists())
                {
                    file.mkdirs();
                }
                //判断文件全路径是否为文件夹,如果是上面已经上传,不需要解压
                if(new File(outPath).isDirectory())
                {
                    continue;
                }
                //输出文件路径信息
                System.out.println(outPath);
                OutputStream out = new FileOutputStream(outPath);
                byte[] buf1 = new byte[1024];
                int len;
                while((len=in.read(buf1))>0)
                {
                    out.write(buf1,0,len);
                }
                in.close();
                out.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return R.ok();
    }

*问题:将MultipartFile转化为File后,放到ZipFile中,使用zipFile.size方法获取数量及压缩文件中的文件名称,会出现一个名为压缩包文件名称的文件,数量同样多一个。*
上一篇:ffprobe参数show_entries


下一篇:Java遍历map的五种方式