您的位置:首页 > 编程语言 > Java开发

java 文件压缩以及解压缩

2016-06-15 10:32 513 查看

类名:ZipUtil.java

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;

import java.util.zip.ZipOutputStream;

/**

 * 通过Java的Zip输入输出流实现压缩和解压文件

 * @author *

 * @date 2016年6月15日 上午10:24:25

 */

public class ZipUtil {

 

 /**

     * 压缩文件

     *

     * @param filePath

     *            待压缩的文件路径

     * @return 压缩后的文件

     */

 public static File zip(String filePath) {

        File target = null;

        File source = new File(filePath);

        if (source.exists()) {

            // 压缩文件名=源文件名.zip

            String zipName = source.getName() + ".zip";

            target = new File(source.getParent(), zipName);

            if (target.exists()) {

                target.delete(); // 删除旧的文件

            }

            FileOutputStream fos = null;

            ZipOutputStream zos = null;

            try {

                fos = new FileOutputStream(target);

                zos = new ZipOutputStream(new BufferedOutputStream(fos));

                // 添加对应的文件Entry

                addEntry("/", source, zos);

            } catch (IOException e) {

                throw new RuntimeException(e);

            } finally {

                IOUtil.closeQuietly(zos, fos);

            }

        }

        return target;

    }

 

 /**

     * 扫描添加文件Entry

     *

     * @param base

     *            基路径

     *

     * @param source

     *            源文件

     * @param zos

     *            Zip文件输出流

     * @throws IOException

     */

 private static void addEntry(String base, File source, ZipOutputStream zos)

            throws IOException {

        // 按目录分级,形如:/aaa/bbb.txt

        String entry = base + source.getName();

        if (source.isDirectory()) {

            for (File file : source.listFiles()) {

                // 递归列出目录下的所有文件,添加文件Entry

                addEntry(entry + "/", file, zos);

            }

        } else {

            FileInputStream fis = null;

            BufferedInputStream bis = null;

            try {

                byte[] buffer = new byte[1024 * 10];

                fis = new FileInputStream(source);

                bis = new BufferedInputStream(fis, buffer.length);

                int read = 0;

                zos.putNextEntry(new ZipEntry(entry));

                while ((read = bis.read(buffer, 0, buffer.length)) != -1) {

                    zos.write(buffer, 0, read);

                }

                zos.closeEntry();

            } finally {

                IOUtil.closeQuietly(bis, fis);

            }

        }

    }

 

 /**

     * 解压文件

     *

     * @param filePath

     *            压缩文件路径

     */

 public static void unzip(String filePath) {

        File source = new File(filePath);

        if (source.exists()) {

            ZipInputStream zis = null;

            BufferedOutputStream bos = null;

            try {

                zis = new ZipInputStream(new FileInputStream(source));

                ZipEntry entry = null;

                while ((entry = zis.getNextEntry()) != null

                        && !entry.isDirectory()) {

                    File target = new File(source.getParent(), entry.getName());

                    if (!target.getParentFile().exists()) {

                        // 创建文件父目录

                        target.getParentFile().mkdirs();

                    }

                    // 写入文件

                    bos = new BufferedOutputStream(new FileOutputStream(target));

                    int read = 0;

                    byte[] buffer = new byte[1024 * 10];

                    while ((read = zis.read(buffer, 0, buffer.length)) != -1) {

                        bos.write(buffer, 0, read);

                    }

                    bos.flush();

                }

                zis.closeEntry();

            } catch (IOException e) {

                throw new RuntimeException(e);

            } finally {

                IOUtil.closeQuietly(zis, bos);

            }

        }

    }

 

 public static void main(String[] args) {

  String targetPath = "D:/aa/ziptest/20160612/IND16061232ACOMA";

        File file = ZipUtil.zip(targetPath);

        System.out.println(file);

        ZipUtil.unzip("D:/aa/ziptest/20160612/IND16061232ACOMA.zip");

 }

}

类名:IOUtil.java

/**

 * IO流工具类

 * @author *

 * @date 2016年6月15日 上午10:25:43

 */

public class IOUtil {

 

 /**

     * 关闭一个或多个流对象

     *

     * @param closeables

     *            可关闭的流对象列表

     * @throws IOException

     */

    public static void close(Closeable... closeables) throws IOException {

        if (closeables != null) {

            for (Closeable closeable : closeables) {

                if (closeable != null) {

                    closeable.close();

                }

            }

        }

    }

   

    /**

     * 关闭一个或多个流对象

     *

     * @param closeables

     *            可关闭的流对象列表

     */

    public static void closeQuietly(Closeable... closeables) {

        try {

            close(closeables);

        } catch (IOException e) {

            // do nothing

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 压缩 zip