天天看點

Java多檔案批量生成zip

1.Java多檔案批量生成zip

/**
     * 生成壓縮包
     * @param request
     * @param campId
     * @return
     */
    public static String generateZip(HttpServletRequest request, String campId,
                                     HttpServletResponse response){
        //zip包存儲路徑
        String  zipName= campId+".zip";//自定義zip包的檔案名
        String  zipFilePath = getAndSetAbsolutePath(request, Constants.ZipPath, zipName);//定義zip包存放路徑+名字
        //擷取excel存儲路徑
        String excelDir = getServerPath(request, Constants.ExcelPath);//擷取要批量壓縮的檔案目錄
//        checkDir(excel);
        //周遊excel存儲路徑
        //擷取pathName的File對象
        File dirFile = new File(excelDir);
        //擷取此目錄下的所有檔案名與目錄名
        String[] fileList = dirFile.list();

        //根據臨時的zip壓縮包路徑,建立zip檔案
        File zip = new File(zipFilePath);
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        try {
            if (!zip.exists()){//建立zip封包件
                zip.createNewFile();
            }

            //建立zip檔案輸出流
            fos = new FileOutputStream(zip);
            zos = new ZipOutputStream(fos);

            //循環讀取檔案路徑集合,擷取每一個檔案的路徑
            for(String fp : fileList){
                File f = new File(excelDir, fp);  //根據檔案路徑建立檔案
                zipFile(f, zos);  //将每一個檔案寫入zip檔案包内,即進行打包
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try{
                if(zos != null){
//                    zos.closeEntry();
                    zos.close();
                }
                if(fos != null){
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return zipFilePath;
    }

    /**
     * 封裝壓縮檔案的方法
     * @param inputFile
     * @param zipoutputStream
     */
    public static void zipFile(File inputFile,ZipOutputStream zipoutputStream) {
        try {
            if(inputFile.exists()) { //判斷檔案是否存在
                if (inputFile.isFile()) {  //判斷是否屬于檔案,還是檔案夾

                    //建立輸入流讀取檔案
                    FileInputStream fis = new FileInputStream(inputFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);

                    //将檔案寫入zip内,即将檔案進行打包
                    ZipEntry ze = new ZipEntry(inputFile.getName()); //擷取檔案名
                    zipoutputStream.putNextEntry(ze);

                    //寫入檔案的方法,同上
                    byte [] b=new byte[1024];
                    long l=0;
                    while(l<inputFile.length()){
                        int j=bis.read(b,0,1024);
                        l+=j;
                        zipoutputStream.write(b,0,j);
                    }
                    //關閉輸入輸出流
                    fis.close();
                    bis.close();
                } else {  //如果是檔案夾,則使用窮舉的方法擷取檔案,寫入zip
                    try {
                        File[] files = inputFile.listFiles();
                        for (int i = 0; i < files.length; i++) {
                            zipFile(files[i], zipoutputStream);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }