Java Zip实用类

x33g5p2x  于2022-10-06 转载在 Java  
字(4.8k)|赞(0)|评价(0)|浏览(293)

在这篇文章中,我们将讨论几个常用的Java Zip工具方法。 

我们还可以向你展示Zip实用方法的JUnit测试案例样本。 

ZipUtils类包含以下通用方法。

  1. zipFiles(List files, OutputStream outputStream) - 将一个文件集合压缩到一个目标压缩输出流。
  2. unZipFiles(File zipFile, File outputFolder) - 解压缩一个压缩文件到一个输出文件夹。
  3. zipFiles(List files, File zipFile) - 将一个文件集合压缩到一个目标压缩文件。
  4. unZipFiles(InputStream inputStream, File outputFolder) - 将一个压缩文件从输入流中解压到一个输出文件夹。

Java Zip实用程序类 - ZipUtils

注意,ZipUtils.java包含一个第三方库--apache-commons-io.

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.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;

/**
* Utility for zipping files.
* @author javaguides.net
*/
public class ZipUtils {

    /**
* Zips a collection of files to a destination zip output stream.
*
* @param files        A collection of files and directories
* @param outputStream The output stream of the destination zip file
* @throws FileNotFoundException
* @throws IOException
*/
    public static void zipFiles(List<File> files, OutputStream outputStream) throws IOException {
        ZipOutputStream zos = new ZipOutputStream(outputStream);

        for (File file : files) {
            if (file.isDirectory()) {   //if it's a folder
                addFolderToZip("", file, zos);
            } else {
                addFileToZip("", file, zos);
            }
        }

        zos.finish();
    }

    /**
* Adds a directory to the current zip
*
* @param path   the path of the parent folder in the zip
* @param folder the directory to be  added
* @param zos    the current zip output stream
* @throws FileNotFoundException
* @throws IOException
*/
    private static void addFolderToZip(String path, File folder, ZipOutputStream zos) throws IOException {
        String currentPath = StringUtils.isNotEmpty(path)? path + "/" + folder.getName(): folder.getName();

        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                addFolderToZip(currentPath, file, zos);
            } else {
                addFileToZip(currentPath, file, zos);
            }
        }
    }
    
    /**
* Adds a file to the current zip output stream
*
* @param path the path of the parent folder in the zip
* @param file the file to be added
* @param zos  the current zip output stream
* @throws FileNotFoundException
* @throws IOException
*/
    private static void addFileToZip(String path, File file, ZipOutputStream zos) throws IOException {
        String currentPath = StringUtils.isNotEmpty(path)? path + "/" + file.getName(): file.getName();

        zos.putNextEntry(new ZipEntry(currentPath));

        InputStream is = new BufferedInputStream(new FileInputStream(file));
        try {
            IOUtils.copy(is, zos);
        } finally {
            IOUtils.closeQuietly(is);
        }
        zos.closeEntry();
    }
    /**
* Zips a collection of files to a destination zip file.
*
* @param files   A collection of files and directories
* @param zipFile The path of the destination zip file
* @throws FileNotFoundException
* @throws IOException
*/
    public static void zipFiles(List<File> files, File zipFile) throws IOException {
        OutputStream os = new BufferedOutputStream(new FileOutputStream(zipFile));
        try {
            zipFiles(files, os);
        } finally {
            IOUtils.closeQuietly(os);
        }
    }

    /**
* Unzips a zip from an input stream into an output folder.
*
* @param inputStream  the zip input stream
* @param outputFolder the output folder where the files
* @throws IOException
*/
    public static void unZipFiles(InputStream inputStream, File outputFolder) throws IOException {
        ZipInputStream zis = new ZipInputStream(inputStream);
        ZipEntry ze = zis.getNextEntry();

        while (ze != null) {
            File file = new File(outputFolder, ze.getName());
            OutputStream os = new BufferedOutputStream(FileUtils.openOutputStream(file));

            try {
                IOUtils.copy(zis, os);
            } finally {
                IOUtils.closeQuietly(os);
            }

            zis.closeEntry();
            ze = zis.getNextEntry();
        }
    }

    /**
* Unzips a zip file into an output folder.
*
* @param zipFile      the zip file
* @param outputFolder the output folder where the files
* @throws IOException
*/
    public static void unZipFiles(File zipFile, File outputFolder) throws IOException {
        InputStream is = new BufferedInputStream(new FileInputStream(zipFile));
        try {
            unZipFiles(is, outputFolder);
        } finally {
            IOUtils.closeQuietly(is);
        }
    }
}

ZipUtilsTest

package com.javaguides.javaio.utility;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

public class ZipUtilsTest {

 @Test
 public void zipFilesTest() throws IOException {
  FileOutputStream fos = new FileOutputStream("C:/Project_Work/samples/src_sample1.zip");
  File file = new File("C:\\Project_Work\\samples\\outputzip\\sample.txt");
  File file1 = new File("C:\\Project_Work\\samples\\outputzip\\sample1.txt");
  File file2 = new File("C:\\Project_Work\\samples\\outputzip\\sample2.txt");

  List<File> files = new ArrayList<>();
  files.add(file);
  files.add(file1);
  files.add(file2);
  ZipUtils.zipFiles(files, fos);
 }

 @Test
 public void unZipFilesTest() throws IOException {
  File zipFile = new File("C:/Project_Work/samples/src_sample1.zip");
  File unZipOutputFolder = new File("C:/Project_Work/samples/dest_folder");
  ZipUtils.unZipFiles(zipFile, unZipOutputFolder);
 }
}

相关文章

微信公众号

最新文章

更多