zoukankan      html  css  js  c++  java
  • 利用java的ZipOutputStream类解压/解压缩文件或文件夹中的文件

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    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 java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipFile;
    import java.util.zip.ZipOutputStream;
    import java.util.zip.GZIPInputStream;
    import java.io.DataInputStream;


    public class Zips {
            /**
             * zip压缩功能测试. 将d:\\temp\\zipout目录下的所有文件连同子目录压缩到d:\\temp\\out.zip.
             *
             * @param baseDir 所要压缩的目录名(包含绝对路径)
             * @param objFileName 压缩后的文件名
             * @throws Exception
             */
            public void createZip(String baseDir, String objFileName) throws Exception {
                    File folderObject = new File(baseDir);
                    if (folderObject.exists()){
                            List fileList = getSubFiles(new File(baseDir));

                            //压缩文件名
                            ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFileName));

                            ZipEntry ze = null;
                            byte[] buf = new byte[1024];
                            int readLen = 0;
                            for (int i = 0; i < fileList.size(); i++) {
                                    File f = (File) fileList.get(i);
                                    System.out.println("Adding: " + f.getPath() + f.getName());

                                    //创建一个ZipEntry,并设置Name和其它的一些属性
                                    ze = new ZipEntry(getAbsFileName(baseDir, f));
                                    ze.setSize(f.length());
                                    ze.setTime(f.lastModified());

                                    //将ZipEntry加到zos中,再写入实际的文件内容
                                    zos.putNextEntry(ze);
                                    InputStream is = new BufferedInputStream(new FileInputStream(f));
                                    while ((readLen = is.read(buf, 0, 1024)) != -1) {
                                            zos.write(buf, 0, readLen);
                                    }
                                    is.close();
                                    System.out.println("done...");
                            }
                            zos.close();
                    }else{
                            throw new Exception("this folder isnot exist!");
                    }
            }
            /**
             * zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
             *
             * @param baseDir 所要压缩的文件名
             * @param objFileName 压缩后的文件名
             * @return 压缩后文件的大小
             * @throws Exception
             */
            public long createFileToZip(String zipFilename,String sourceFileName) throws Exception {

                    File sourceFile = new File(sourceFileName);
                    byte[] buf = new byte[1024];

                    //压缩文件名
                    File objFile = new File(zipFilename);
                    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));
                    ZipEntry ze = null;
                   
                    //创建一个ZipEntry,并设置Name和其它的一些属性
                    ze = new ZipEntry(sourceFile.getName());
                    ze.setSize(sourceFile.length());
                    ze.setTime(sourceFile.lastModified());

                    //将ZipEntry加到zos中,再写入实际的文件内容
                    zos.putNextEntry(ze);
                    InputStream is = new BufferedInputStream(new FileInputStream(sourceFile));
                    int readLen = -1;
                    while ((readLen = is.read(buf, 0, 1024)) != -1) {
                            zos.write(buf, 0, readLen);
                    }
                    is.close();
                    zos.close();
                    return objFile.length();
            }
            /**
             * 测试解压缩功能. 将d:\\download\\test.zip连同子目录解压到d:\\temp\\zipout目录下.
             *
             * @throws Exception
             */
            public void releaseZipToFile(String sourceZip, String outFileName)throws IOException{
                          ZipFile zfile=new ZipFile(sourceZip);
                          System.out.println(zfile.getName());
                          Enumeration zList=zfile.entries();
                          ZipEntry ze=null;
                          byte[] buf=new byte[1024];
                          while(zList.hasMoreElements()){
                          //从ZipFile中得到一个ZipEntry
                          ze=(ZipEntry)zList.nextElement();
                          if(ze.isDirectory()){
                          continue;
                          }
                          //以ZipEntry为参数得到一个InputStream,并写到OutputStream中
                          OutputStream os=new BufferedOutputStream(new FileOutputStream(getRealFileName(outFileName, ze.getName())));
                          InputStream is=new BufferedInputStream(zfile.getInputStream(ze));
                          int readLen=0;
                          while ((readLen=is.read(buf, 0, 1024))!=-1) {
                          os.write(buf, 0, readLen);
                          }
                          is.close();
                          os.close();
                          System.out.println("Extracted: "+ze.getName());
                          }
                          zfile.close();
            }
            /**
             * 取得指定目录下的所有文件列表,包括子目录.
             *
             * @param baseDir
             *            File 指定的目录
             * @return 包含java.io.File的List
             */
            private List getSubFiles(File baseDir) {
                    List ret = new ArrayList();
                    //File base=new File(baseDir);
                    File[] tmp = baseDir.listFiles();
                    for (int i = 0; i < tmp.length; i++) {
                            if (tmp[i].isFile()) {
                                    ret.add(tmp[i]);
                            }
                            if (tmp[i].isDirectory()) {
                                    ret.addAll(getSubFiles(tmp[i]));
                            }
                    }
                    return ret;
            }
            /**
             * 给定根目录,返回一个相对路径所对应的实际文件名.
             *
             * @param baseDir
             *            指定根目录
             * @param absFileName
             *            相对路径名,来自于ZipEntry中的name
             * @return java.io.File 实际的文件
             */
            private File getRealFileName(String baseDir, String absFileName) {
                    String[] dirs = absFileName.split("/");
                    //System.out.println(dirs.length);
                    File ret = new File(baseDir);
                    //System.out.println(ret);
                    if (dirs.length > 1) {
                            for (int i = 0; i < dirs.length - 1; i++) {
                                    ret = new File(ret, dirs[i]);
                            }
                    }
                    if (!ret.exists()) {
                            ret.mkdirs();
                    }
                    ret = new File(ret, dirs[dirs.length - 1]);
                    return ret;
            }
            /**
             * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
             *
             * @param baseDir
             *            java.lang.String 根目录
             * @param realFileName
             *            java.io.File 实际的文件名
             * @return 相对文件名
             */
            private String getAbsFileName(String baseDir, File realFileName) {
                    File real = realFileName;
                    File base = new File(baseDir);
                    String ret = real.getName();
                    while (true) {
                            real = real.getParentFile();
                            if (real == null)
                                    break;
                            if (real.equals(base))
                                    break;
                            else {
                                    ret = real.getName() + "/" + ret;
                            }
                    }
                    System.out.println("K " + ret);
                    return ret;
            }

         public static void main(String args[]){
         Zips manager = new Zips();
         try {
    //   manager.createFileToZip("d:\\temp\\out.zip","");
           manager.releaseZipToFile("d:\\temp\\out.zip","d:\\test");
           //manager.createZip("d:\\temp\\zipout","d:\\temp\\out.zip");
         }
         catch (Exception e) {
        e.printStackTrace();
         }
         System.out.println("END");
       }

    }

  • 相关阅读:
    关于 未能加载文件或程序集“”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配 的解决办法
    过滤特殊字符 格式化字符型、日期型、布尔型
    Sql Sercer 行转列 列转行
    Datatable转换为Json
    list转datatble
    List与string之间转化
    从html中提取纯文本
    已成功与服务器建立连接,但是在登录过程中发生错取。(provider:共享内存提供程序,error:0-管道的另一端上无任何进程。)(Microsoft SQL Server,错误:233)
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    MVC生成二维码和条形码
  • 原文地址:https://www.cnblogs.com/jiayonghua/p/3077827.html
Copyright © 2011-2022 走看看