zoukankan      html  css  js  c++  java
  • 《Java知识应用》Java压缩文件和解压缩

     今天通过Java实现一下:文件的压缩和解压缩。

    1. 压缩

    准备文件:

    准备代码:(压缩)

    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;
    
    public class CompressUtils {
    
        public static void main(String[] args) {
            //需要压缩的文件路径
            List<String> filePathList = new ArrayList<>();
            filePathList.add("src\demo\knowledgepoints\compress\filezip\1.docx");
            filePathList.add("src\demo\knowledgepoints\compress\filezip\1.pdf");
    
            //压缩后的文件路径
            String zipPath = "src/demo/knowledgepoints/compress/filezip/1.zip";
            toZip(filePathList,zipPath);
        }
    
        /**
         * 压缩文件
         * @param filePathList
         * @param zipPath
         * @throws RuntimeException
         */
        public static void toZip(List<String> filePathList,String zipPath) throws RuntimeException {
            List<File> adjustFiles = new ArrayList<>();
            for (String filePath :filePathList){
                adjustFiles.add(new File(filePath));
            }
    
            ByteArrayOutputStream fos2 = new ByteArrayOutputStream();
            CompressUtils.toZip(adjustFiles, fos2);
    
            BufferedOutputStream output = null;
            BufferedInputStream bis = null;
            FileOutputStream fos = null;
            byte[] fileBytes = fos2.toByteArray();
            try {
                ByteArrayInputStream byteInputStream = new ByteArrayInputStream(fileBytes);
    
                bis = new BufferedInputStream(byteInputStream);
                File file = new File(zipPath);
                file.createNewFile();
    
                fos = new FileOutputStream(file);
                // 实例化OutputString 对象
                output = new BufferedOutputStream(fos);
                byte[] buffer = new byte[1024];
                int length = bis.read(buffer);
                while (length != -1) {
                    output.write(buffer, 0, length);
                    length = bis.read(buffer);
                }
                output.flush();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bis != null) {
                        bis.close();
                    }
                    if (fos != null) {
                        fos.close();
                    }
                    if (output != null) {
                        output.close();
                    }
                } catch (IOException e0) {
                    e0.printStackTrace();
                }
            }
        }
    
        /**
         * 压缩成ZIP
         * @param srcFiles 需要压缩的文件列表
         * @param out      压缩文件输出流
         * @throws RuntimeException 压缩失败会抛出运行时异常
         */
        public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
            long start = System.currentTimeMillis();
            ZipOutputStream zos = null;
            try {
                zos = new ZipOutputStream(out);
                for (File srcFile : srcFiles) {
                    byte[] buf = new byte[1024];
                    zos.putNextEntry(new ZipEntry(srcFile.getName()));
                    int len;
                    FileInputStream in = new FileInputStream(srcFile);
                    while ((len = in.read(buf)) != -1) {
                        zos.write(buf, 0, len);
                    }
                    zos.closeEntry();
                    in.close();
                }
                long end = System.currentTimeMillis();
                System.out.println("压缩完成,耗时:" + (end - start) + " ms");
            } catch (Exception e) {
                throw new RuntimeException("zip error from ZipUtils", e);
            } finally {
                if (zos != null) {
                    try {
                        zos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行效果:

     

    1. 解压缩

    将刚刚压缩的文件放到新的路径下:

    准备代码:(解压缩)

    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.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    public class CompressUtils {
    
        public static void main(String[] args) {
            String zipPath = "src\demo\knowledgepoints\compress\file\1.zip";
            String filePath = "src\demo\knowledgepoints\compress\file";
            zipToFile(zipPath,filePath);
        }
    
        /**
         * zip解压过程
         * @param zipPath  压缩文件路径
         * @param filePath 解压后文件夹路径
         * @throws RuntimeException
         */
        public static void zipToFile(String zipPath, String filePath) throws RuntimeException {
            long startTime = System.currentTimeMillis();
    
            BufferedInputStream Bin = null;  //数据源缓存流
            ZipInputStream Zin = null;  //数据源
            FileOutputStream out = null;  //输出流
            BufferedOutputStream Bout = null;  //输出缓存流
            try {
                Zin = new ZipInputStream(new FileInputStream(zipPath));//输入源zip路径
                Bin = new BufferedInputStream(Zin);
                File Fout;
                ZipEntry entry;
                while ((entry = Zin.getNextEntry()) != null && !entry.isDirectory()) {
                    Fout = new File(filePath, entry.getName());
                    if (!Fout.exists()) {
                        new File(Fout.getParent()).mkdirs();
                    }
                    out = new FileOutputStream(Fout);
                    Bout = new BufferedOutputStream(out);
                    int bytes;
                    while ((bytes = Bin.read()) != -1) {
                        Bout.write(bytes);
                    }
                    System.out.println(Fout + "解压成功");
                }
                long endTime = System.currentTimeMillis();
                System.out.println("耗费时间: " + (endTime - startTime) + " ms");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    if (Bin != null) {
                        Bin.close();
                    }
                    if (Zin != null) {
                        Zin.close();
                    }
                    if (Bout != null) {
                        Bout.close();
                    }
                    if (out != null) {
                        out.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    运行结果:

    参考:https://www.cnblogs.com/wangxuemei/p/8360800.html

    This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
  • 相关阅读:
    Javascript 操作select控件大全(新增、修改、删除、选中、清空、判断存在等) 转载
    FCKeditor 2.6 + Asp.Net 设置
    19个常用.net webservice服务集合
    ASP.NET Session无法使用或易丢失
    javascript实现缩略图
    Asp.net Excel导入或导出
    smarty截取中文乱码问题解决办法转载
    Git学习
    Android活动(Activity)的基本介绍
    Android活动(Activity)Toast和Menu
  • 原文地址:https://www.cnblogs.com/jssj/p/11862916.html
Copyright © 2011-2022 走看看