Java使用Zip压缩文件或整个目录

1.压缩文件或整个目录

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipCompressor {

    private String mFileDest;
    private ZipOutputStream mZipOutputStream;
    private byte[] buffer = new byte[1024];
    private int ret = 0;
    private static final String SEPARATOR = File.separator;

    // public static void main(String[] args) {
    //
    // // ZipCompress zipCompress = new ZipCompress("E://1.zip");
    // ZipCompressor zipCompressor = new ZipCompressor("1.zip");
    //
    // zipCompressor.add("1.txt");
    // zipCompressor.add(".");
    // zipCompressor.add("2.txt");
    // zipCompressor.close();
    // }

    /**
     * path zip目标文件的名字
     */
    public ZipCompressor(String path) {
        mFileDest = new File(path).getAbsolutePath();

        FileOutputStream fos;
        try {
            fos = new FileOutputStream(mFileDest, true);
            mZipOutputStream = new ZipOutputStream(fos);
        } catch (FileNotFoundException e) {
            printStackTrace(e);
        }
    }

    public void close() {
        if (mZipOutputStream != null) {
            try {
                mZipOutputStream.close();
            } catch (IOException e) {
                printStackTrace(e);
            }
            mZipOutputStream = null;
        }
    }

    /**
     * filePath 待压缩的文件或目录,可以是相对目录
     */
    public void add(String filePath) {

        try {
            File file = new File(filePath);
            String path = "";
            if (file.isDirectory()) {
                filePath = file.getAbsolutePath();
                if (filePath.endsWith("."))
                    filePath = filePath.substring(0, filePath.length() - 1);
                if (filePath.endsWith(SEPARATOR))
                    filePath = filePath.substring(0, filePath.length() - 1);
                // System.out.println("filePath:" + filePath);

                int pos = filePath.lastIndexOf(SEPARATOR);
                // System.out.println(filePath.substring(0, pos));
                if (filePath.substring(0, pos).contains(SEPARATOR))
                    path = filePath.substring(pos + 1, filePath.length())
                            + SEPARATOR;
                // System.out.println("path:" + path);
            }

            add(mZipOutputStream, path, filePath);
        } catch (IOException e) {
            printStackTrace(e);
        }
    }

    /**
     * zos zip压缩的目标文件 path 待创建的zip文件夹内的相内路径 file 待压缩的文件或目录的路径
     */
    private void add(ZipOutputStream zos, String path, String file)
            throws FileNotFoundException {

        try {
            File inputFile = new File(file);
            if (inputFile.isFile()) {
                add(zos, path, inputFile);
            } else if (inputFile.isDirectory()) {
                // System.out.println("add dir:" + inputFile.getName());

                for (File subFile : inputFile.listFiles()) {
                    if (subFile.isDirectory()) {
                        String newPath = path + subFile.getName() + SEPARATOR;
                        add(zos, newPath, subFile.getPath());
                    } else {
                        add(zos, path, subFile);
                    }
                }
            }
        } catch (IOException e) {
            printStackTrace(e);
        }
    }

    /**
     * zos zip压缩的目标文件 path 待创建的zip文件夹内的相内路径 file 待压缩的文件
     */
    private void add(ZipOutputStream zos, String path, File file) {
        FileInputStream fis = null;
        try {

            path.equalsIgnoreCase("");
            // 防止将目标zip文件打包进自己的压缩包内
            String src = file.getAbsolutePath();
            // System.out.println("src:" + src);
            if (mFileDest.equalsIgnoreCase(src)) {
                // System.out.println("Error! It‘s dest file! " + src);
                return;
            }

            try {
                ZipEntry zipEntry = new ZipEntry(path + file.getName());
                zos.putNextEntry(zipEntry);
                FileInputStream fin = new FileInputStream(file);
                while ((ret = fin.read(buffer)) != -1) {
                    zos.write(buffer, 0, ret);
                }
                fin.close();
                zos.closeEntry();
            } catch (Exception e) {
                printStackTrace(e);
            }

        } catch (Exception e) {
            printStackTrace(e);
        } finally {
            try {
                if (fis != null)
                    fis.close();
            } catch (IOException e) {
                printStackTrace(e);
            }
        }
    }

    private void printStackTrace(Exception exception) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        exception.printStackTrace(pw);
        System.out.print(sw.toString());

        // e.printStackTrace();
    }
}
时间: 2024-10-10 23:01:33

Java使用Zip压缩文件或整个目录的相关文章

java实现zip压缩文件

在网上找到这几种方法,感觉不错,收集起来,方便大家使用 jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,出现乱码问题,实现代码如下 /** * 功能:把 sourceDir 目录下的所有文件进行 zip 格式的压缩,保存为指定 zip 文件 * @param sourceDir 如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件: * 如果是文件,eg:D:\\MyEclipse\\fi

Java操作Zip压缩文件遇到的编码问题

1.遇到的问题:在for循环操作zip文件(文件名包含中文)的过程中,报错如下: Exception in thread "main" java.lang.IllegalArgumentException: MALFORMED at java.util.zip.ZipCoder.toString(ZipCoder.java:58) at java.util.zip.ZipInputStream.readLOC(ZipInputStream.java:297) at java.util.

java生成zip压缩文件,解压缩文件

1.生成zip public static void main(String[] args) { try { // testZip("c:\\temp.txt", "c:\\temp4.zip"); // testZip("c:\\Result.txt", "c:\\temp4.zip"); //不然会被一个文件覆盖了. //压缩多个文件的关键: ZipOutputStream out 作为参数传递. //一个流,否则存在覆盖

Java ZIP压缩文件使用总结

做Java Web开发,有时候遇到将多个文件或者文件夹压缩成一个.zip文件,供前端下载.Java的JDK中提供一个java.util.zip的接口,供大家使用.如下图: 图上就是Java 的JDK提供的接口,但是压缩文件或者文件夹的时候,怎么使用上面的接口呢?下面我给出几个相关的接口,这些接口是下面压缩文件或者文件夹过程中使用到的. java.util.zip.ZipEntry; java.util.zip.ZipOutputStream; 下面的压缩过程主要是通过这两个接口压缩文件或者文件夹

Java—将文件打包为zip压缩文件

import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipE

最新Zip压缩文件漏洞,黑客可以触发目录遍历攻击

近日,国内某安全公司研究人员透露了一个关键漏洞的详细信息,该漏洞影响了许多生态系统中的数千个项目,黑客可以利用这些漏洞在目标系统上实现代码执行. 黑客是如何通过Zip压缩文件入侵攻击?被称为"ZipSlip"的问题是一个任意的文件覆盖漏洞,在从档案文件中提取文件时触发目录遍历攻击,并影响包括tar,jar,war,cpio,apk,rar和7z在内的大量压缩文件. 用Google,Oracle,IBM,Apache,亚马逊,Spring/Pivotal,Linkedin,Twitter

java基础---->Zip压缩的使用(转)

java中提供了对压缩格式的数据流的读写.它们封装到现成的IO 类中,以提供压缩功能.下面我们开始java中压缩文件的使用. 目录导航: 关于压缩的简要说明 GZIP压缩文件的使用 ZIP压缩文件的使用 GZIP与ZIP压缩的比较 友情链接 关于压缩的简要说明 一. Java中有着压缩的类: CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压) CheckedOutputStream GetCheckSum()为任何OutputS

dedecms中提取的zip压缩文件操作类zip.class.php

从织梦DeDeCMS中提取的zip压缩文件操作类,包含zip文件压缩.解压缩.添加文件到压缩包中等多个实用的函数,注释详细方便使用. 下载:dedecms中提取的zip压缩文件操作类zip.class.php 包含的函数和简单的使用方法: 1.函数get_List($zip_name) ,函数作用:获取zip文件中的文件列表.函数参数 $zip_name  zip文件名.返回值 文件列表数组. 2.函数Add($files,$compact),函数作用:增加文件到压缩文件.函数参数 $files

php实现ZIP压缩文件解压缩

测试使用了两个办法都可以实现: 第一个:需要开启配置php_aip.dll 1 <?php 2 //需开启配置 php_zip.dll 3 //phpinfo(); 4 header("Content-type:text/html;charset=utf-8"); 5 6 function get_zip_originalsize($filename, $path) { 7 //先判断待解压的文件是否存在 8 if(!file_exists($filename)){ 9 die(