1. 程式人生 > 其它 >Java實現解壓縮ZIP

Java實現解壓縮ZIP

Java實現解壓縮ZIP,MultipartFile 轉為File工具類

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方法獲取數量及壓縮檔案中的檔名稱,會出現一個名為壓縮包檔名稱的檔案,數量同樣多一個。*