package javasedemo.zip;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apachemonspress.archivers.ArchiveEntry;
import org.apachemonspress.archivers.ArchiveInputStream;
import org.apachemonspress.archivers.ArchiveOutputStream;
import org.apachemonspress.archivers.ArchiveStreamFactory;
import org.apachemonspress.archivers.zip.ZipArchiveEntry;
import org.apachemonspress.utils.IOUtils;
public class ZipDemo {
    public static void main(String[] args) {
        File file=new File("C:\\Users\\tpc\\Desktop\\测试视频");
//        compressFiles2Zip(file, "C:\\Users\\tpc\\Desktop\\testzip.zip");
        decompressZip("C:\\Users\\tpc\\Desktop\\testzip.zip","C:\\Users\\tpc\\Desktop\\testzip");
    }
   
    /**
    * 递归遍历所有文件
    * @param file
    */
    public static void putListFile2Archive(File file,String pathName,ArchiveOutputStream aos){
        try {
            if(file.isFile()){
                //建立压缩包中的目录结构
                ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(pathName);
                //添加成员到压缩包对象中
                aos.putArchiveEntry(zipArchiveEntry);
                //获取当前文件的输入流
                InputStream is=new FileInputStream(file);
                //将输入流内容读取到压缩包输出流中
                py(is, aos);
                //清除entry对象准备添加下一个文件
                aos.closeArchiveEntry();
                is.close();
            }else{
                File[] files=file.listFiles();
                if(files.length>0){
                    for (File f : files) {
                        putListFile2Archive(f,pathName+File.Name(),aos);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
    * 将文件打包成压缩包
    *
    * @param files
    * @param zipFilePath
    */
    public static void compressFiles2Zip(File file, String zipFilePath) {
        if (file != null && ists() && isEndsWithZip(zipFilePath)) {
            ArchiveOutputStream zaos = null;
            try {
                File zipFile = new File(zipFilePath).getParentFile();
                //如果保存的文件上级目录不存在则创建
                if(!ists()){
                    zipFile.mkdirs();
                }
                FileOutputStream fos=new FileOutputStream(zipFilePath);
                zaos=new ArchiveStreamFactory("utf-8").createArchiveOutputStream("zip", fos);
                //zaos = new ZipArchiveOutputStream(zipFile);
                // Use Zip64 extensions for all entries where they are
                // required
                //zaos.setUseZip64(Zip64Mode.AsNeeded);
                //递归遍历
                putListFile2Archive(Name(),zaos);
                //提交,关闭
                zaos.finish();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (zaos != null) {
                        zaos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
    * 把zip文件解压到指定的文件夹
    *
    * @param zipFilePath
    *            zip文件路径, 如 "D:/test/aa.zip"
    * @param saveFileDir
    *            解压后的文件存放路径, 如"D:/test/"
    */
    public static void decompressZip(String zipFilePath, String saveFileDir) {
        if (isEndsWithZip(zipFilePath)) {
            File file = new File(zipFilePath);
            if (ists()) {
                InputStream is = null;
                // can read Zip archives
                ArchiveInputStream zais = null;
                try {
                    is = new FileInputStream(file);
                    zais = new ArchiveStreamFactory("utf-8").createArchiveInputStream("zip", is);
                    ArchiveEntry archiveEntry = null;
                    // 把zip包中的每个文件读取出来
                    // 然后把文件写到指定的文件夹
                    while ((archiveEntry = NextEntry()) != null) {
                        // 获取文件名
                        String entryFileName = Name();
                        // 构造解压出来的文件存放路径
                        String entryFilePath = saveFileDir +File.separator+ entryFileName;
                        //byte[] content = new byte[(int) Size()];
                        byte[] ByteArray(zais);
                        //ad(content);
                        OutputStream os = null;
                        try {
                            File saveFile = new File(entryFilePath).getParentFile();
                            //如果保存的文件上级目录不存在则创建
                            System.out.println("savefile:"+AbsolutePath());
                            if(!ists()){
                                saveFile.mkdirs();
                            }
                            // 把解压出来的文件写到指定路径
                            os = new FileOutputStream(entryFilePath);
                            os.write(content);
                        } catch (IOException e) {
                            e.printStackTrace();
                        } finally {
                            if (os != null) {
                                os.flush();
                                os.close();
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (zais != null) {
                            zais.close();
                        }
                        if (is != null) {
                            is.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    /**
    * 判断文件名是否以.zip为后缀
    *
    * @param fileName
    *            需要判断的文件名
    * @return 是zip文件返回true,否则返回false
    */
    public static boolean isEndsWithZip(String fileName) {
        boolean flag = false;
        if (fileName != null && !"".im())) {
            if (dsWith(".ZIP") || dsWith(".zip")) {
                flag = true;
            }
        }
        return flag;
    }
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。