Java中文件的压缩与解压

Java中通过ZipOutputStream和ZipInputStream实现对一个或多个文件的压缩与解压。压缩时文件时,创建zip输出流,并在流中添加zip条目,用流把文件的内容写入压缩文件中。解压时,创建zip输入流,并分别创建文件夹和zip条目对应的文件,再用流把zip条目中的内容写入个文件中。以下分别展示了如何对一个文件和多个文件实现压缩与解压。

一个文件的压缩与解压

压缩:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/*
 * 需求:将E盘下的zipTest1.txt文件 压缩成 zipTest1.zip文件
 * 分析:
 *    1.利用ZipOutputStream 中的write方法压缩文件。
 *    2.压缩时,文件被压缩成了zip文件中对应的ZipEntry(zip条目),
 *      zip条目的名字需要设置。
 * 实现:
 *    1.根据原文件名获取相应的压缩文件和zip条目的名字;
 *    2.创建文件输入流,读入原文件;创建zip输出流,压缩文件;
 *    3.创建zip条目,并将其添加至zip输出流中;
 *    4.调用write方法,将原文件的内容写入至zip条目中;
 *    5.关闭zip条目,关闭相关流。
 */
public class ZipOutTest1 {
    public static void main(String[] args) {
        String name = "E:\\zipTest1.txt"; //原文件路径

        try {
            zipOut(name);
        } catch (IOException e) {
            System.out.println("压缩文件时出错!");
        }
    }

    private static void zipOut(String name) throws IOException {
        // 根据原文件名得到zip格式的文件名
        String zipName = name.substring(0, name.indexOf("."))
                         + ".zip";
        // 根据原文件名得到zip条目的名称,即文件在压缩文件中的名字
        String zeName = name.substring(name.indexOf("\\")+1);

        // 创建文件输入流 、 文件输出流、 zip输出流
        FileInputStream fis = new FileInputStream(name);
        FileOutputStream fos = new FileOutputStream(zipName);
        ZipOutputStream zos = new ZipOutputStream(fos);

        // 创建zip条目,并将其添加至zip输出流中
        ZipEntry ze = new ZipEntry(zeName);
        zos.putNextEntry(ze);

        // 压缩文件
        byte[] buf = new byte[1024];
        int len;
        while ((len = fis.read(buf)) != -1) {
            zos.write(buf,0,len);
            zos.closeEntry();
        }

        // 关闭流,只有在关闭流后,文件内容才能写入成功
        zos.close();
        fis.close();
    }
}

解压:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/*
 * 需求:将E盘下的zipTest1.zip文件 进行解压。
 * 分析:
 *    1.解压文件用 Zip输入流 读入文件内容后用 文件输出流 输出文件。
 *    2.要根据压缩文件名和zip条目名获取解压后文件的名字。
 * 实现:
 *    1.创建zip输入流;
 *    2.创建zip条目;
 *    3.解压文件按过程中,获取解压后文件的名字后将文件内容输出;
 *    4.关闭zip条目和相关流。
 */
public class ZipInTest1 {
    public static void main(String[] args) {
        String zipName = "E:\\zipTest1.zip";// 压缩文件名

        try {
            zipIn(zipName);
        } catch (IOException e) {
            System.out.println("解压文件时出错!");
        }
    }

    private static void zipIn(String zipName) 
                throws IOException {
        // 创建zip输入流
        FileInputStream fis = new FileInputStream(zipName);
        ZipInputStream zis = new ZipInputStream(fis);
        FileOutputStream fos = null;

        // 创建zip条目
        ZipEntry ze;

        // 解压文件
        while ((ze = zis.getNextEntry()) != null) {
            // 根据压缩文件名和zip条目的名字获取解压后文件的名字
            String fileName = 
                zipName.substring(0, zipName.indexOf("\\") + 1)
                    + ze.getName();
            // 创建文件输出流
            fos = new FileOutputStream(fileName);

            byte[] buf = new byte[1024];
            int len;
            while ((len = zis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            zis.closeEntry();
        }

        zis.close();
        if (fos != null)
            fos.close();
    }
}

// 其实以上代码也可以实现压缩文件中的多个文件的解压,
// 只不过解压后的文件不在一个文件夹内。

多个文件的压缩与解压

压缩:

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.ZipOutputStream;

/*
 * 将zipTest文件夹内的多个文件压缩成zip文件
 *   分别为每个文件创建对应的zip条目,并将内容写入
 */
public class ZipOutTest2 {
    public static void main(String[] args) {
        File srcFile = new File("E:\\zipTest");//原文件所在文件夹
        File destFile = new File("E:\\zipTest.zip");// 压缩后的文件

        try {
            zipOut(srcFile, destFile);
        } catch (IOException e) {
            System.out.println("压缩文件时出错!");
        }
    }

    private static void zipOut(File file, File dest) throws IOException {
        // 创建文件输入流 和 zip输出流
        FileInputStream fis = null;
        ZipOutputStream zos = new ZipOutputStream(
                              new FileOutputStream(dest));

        // 获取文件夹内所以File对象,并将各文件逐一压缩
        File[] files = file.listFiles();
        for (File f : files) {
            fis = new FileInputStream(f);// 读入单个文件

            // 为每个文件添加zip条目
            zos.putNextEntry(new ZipEntry(f.getName()));

            // 将各文件压缩
            byte[] buf = new byte[1024];
            int len;
            while ((len = fis.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }

            zos.closeEntry();
        }

        zos.close();
        if (fis != null)
            fis.close();
    }
}

解压:

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;

/*
 * 对压缩文件中的多个文件解压至指定的文件夹内
 *   利用循环分别为每个zip条目创建对应的文件,并用流写入内容
 */
public class ZipInTest2 {

    public static void main(String[] args) {
        File srcFile = new File("E:\\zipTest.zip");
        File destFile = new File("E:\\zipTest");

        try {
            zipIn(srcFile, destFile);
        } catch (IOException e) {
            System.out.println("解压文件时出错!");
        }
    }

    private static void zipIn(File srcFile, File destFile) throws IOException {
        // 创建zip输入流
        ZipInputStream zis = new ZipInputStream(new FileInputStream(srcFile));
        FileOutputStream fos = null;

        // 解压文件
        ZipEntry ze;
        while ((ze = zis.getNextEntry()) != null) {
        // 创建目标文件夹和目标文件,方便后面将内容写入这些文件
            // 压缩文件中各条目的File对象
            File file = new File(destFile, ze.getName());
            destFile.mkdirs(); // 创建文件夹
            file.createNewFile(); // 创建文件

            // 为各zip条目创建输出流
            fos = new FileOutputStream(file);

            byte[] buf = new byte[1024];
            int len;
            while ((len = zis.read(buf)) != -1) {
                fos.write(buf, 0, len);
            }

            zis.closeEntry();// 关闭zip条目
        }

        if (fos != null)
            fos.close();
        zis.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值