Java-工具类之ZIP压缩解压

来源:互联网 发布:淘宝店怎么打造爆款 编辑:程序博客网 时间:2024/06/02 06:02

  • 概述
  • 实例
    • zip压缩单个或者多个文件
    • unzip到指定目录
    • zip目录及子孙目录
    • 不解压读取zip中的文件列表

概述

整理ZIP相关的工具类

这里写图片描述


实例

代码已托管到 https://github.com/yangshangwei/commonUtils

zip压缩单个或者多个文件

package com.artisan.commonUtils.zip;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** *  *  * @ClassName: ZipUtility *  * @Description: 【Steps to Compress a File in Java 】 *  *               Here are the steps to compress a file using Java code: *  *               1. Open a ZipOutputStream that wraps an OutputStream like *               FileOutputStream. The ZipOutputStream class implements an *               output stream filter for writing in the ZIP file format. *  *               2. Put a ZipEntry object by calling the putNextEntry(ZipEntry) *               method on the ZipOutputStream. The ZipEntry class represents an *               entry of a compressed file in the ZIP file. *  *               3. Read all bytes from the original file by using the *               Files.readAllBytes(Path) method. *  *               4. Write all bytes read to the output stream using the *               write(byte[] bytes, int offset, int length) method. *  *               5. Close the ZipEntry. *  *               6. Close the ZipOutputStream. *  *               You can also set the compression method and compression level *               using the following ZipOutputStream’s methods: *  *               A: setMethod(int method): there are 2 methods: DEFLATED (the *               default) which compresses the data; and STORED which doesn’t *               compress the data (archive only). *  *               B: setLevel(int level): sets the compression level ranging from *               0 to 9 (the default). *  * @author: Mr.Yang *  * @date: 2017年9月7日 下午8:24:15 */public class ZipUtility {    /**     *      *      * @Title: compressSingleFile     *      * @Description: compress a file in ZIP format     *      * @param filePath     *      * @return: void     */    public static void compressSingleFile(String filePath, String outPut) {        try {            File file = new File(filePath);            String zipFileName = file.getName().concat(".zip");            System.out.println("zipFileName:" + zipFileName);            // if you want change the menu of output ,just fix here            // FileOutputStream fos = new FileOutputStream(zipFileName);            FileOutputStream fos = new FileOutputStream(outPut + File.separator + zipFileName);            ZipOutputStream zos = new ZipOutputStream(fos);            zos.putNextEntry(new ZipEntry(file.getName()));            byte[] bytes = Files.readAllBytes(Paths.get(filePath));            zos.write(bytes, 0, bytes.length);            zos.closeEntry();            zos.close();        } catch (FileNotFoundException ex) {            System.err.format("The file %s does not exist", filePath);        } catch (IOException ex) {            System.err.println("I/O error: " + ex);        }    }    /**     *      *      * @Title: compressMultipleFiles     *      * @Description: compresses multiple files into a single ZIP file.     *      *               The file paths are passed from the command line,     *      *               and the ZIP file name is name of the first file followed by     *               the .zip extension     *      * @param filePaths     *      * @return: void     */    public static void compressMultipleFiles(String... filePaths) {        try {            File firstFile = new File(filePaths[0]);            String zipFileName = firstFile.getName().concat(".zip");            FileOutputStream fos = new FileOutputStream(zipFileName);            ZipOutputStream zos = new ZipOutputStream(fos);            for (String aFile : filePaths) {                zos.putNextEntry(new ZipEntry(new File(aFile).getName()));                byte[] bytes = Files.readAllBytes(Paths.get(aFile));                zos.write(bytes, 0, bytes.length);                zos.closeEntry();            }            zos.close();        } catch (FileNotFoundException ex) {            System.err.println("A file does not exist: " + ex);        } catch (IOException ex) {            System.err.println("I/O error: " + ex);        }    }    public static void main(String[] args) {        ZipUtility.compressSingleFile("D:/JavaMaster.log", "H:");        ZipUtility.compressMultipleFiles("D:/Temp.log", "D:/JavaMaster.log");    }}

unzip到指定目录

package com.artisan.commonUtils.zip;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;/** *  *  * @ClassName: UnzipUtility *  * @Description: The java.util.zip package provides the following classes for *               extracting files and directories from a ZIP archive: *  *               A:----> ZipInputStream: this is the main class which can be *               used for reading zip file and extracting files and directories *               (entries) within the archive. Here are some important usages of *               this class: *  *               1.read a zip via its constructor *               ZipInputStream(FileInputStream) *  *               2.read entries of files and directories via method *               getNextEntry() *  *               3.read binary data of current entry via method read(byte) *  *               4.close current entry via method closeEntry() *  *               5.close the zip file via method close() *  *  *  *               B:----> ZipEntry: this class represents an entry in the zip *               file. Each file or directory is represented as a ZipEntry *               object. Its method getName() returns a String which represents *               path of the file/directory. *  *               The path is in the following form: *               folder_1/subfolder_1/subfolder_2/…/subfolder_n/file.ext *  * @author: Mr.Yang *  * @date: 2017年9月7日 下午8:10:06 *  *  * @comments The UnzipUtility class has a public method for extracting files and *           directories from a zip archive: *  *           unzip(String zipFilePath, String destDirectory): *  *           extracts content of a zip file specified by zipFilePath to a *           directory specified by destDirectory. *  */public class UnzipUtility {    /**     * Size of the buffer to read/write data     */    private static final int BUFFER_SIZE = 4096;    /**     * Extracts a zip file specified by the zipFilePath to a directory specified     * by destDirectory (will be created if does not exists)     *      * @param zipFilePath     * @param destDirectory     * @throws IOException     */    public static void unzip(String zipFilePath, String destDirectory) throws IOException {        File destDir = new File(destDirectory);        if (!destDir.exists()) {            destDir.mkdir();        }        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));        ZipEntry entry = zipIn.getNextEntry();        // iterates over entries in the zip file        while (entry != null) {            String filePath = destDirectory + File.separator + entry.getName();            if (!entry.isDirectory()) {                // if the entry is a file, extracts it                extractFile(zipIn, filePath);            } else {                // if the entry is a directory, make the directory                File dir = new File(filePath);                dir.mkdir();            }            zipIn.closeEntry();            entry = zipIn.getNextEntry();        }        zipIn.close();    }    /**     * Extracts a zip entry (file entry)     *      * @param zipIn     * @param filePath     * @throws IOException     */    public static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));        byte[] bytesIn = new byte[BUFFER_SIZE];        int read = 0;        while ((read = zipIn.read(bytesIn)) != -1) {            bos.write(bytesIn, 0, read);        }        bos.close();    }    public static void main(String[] args) {        String zipFilePath = "D:/test.zip";        String destDirectory = "H:/";        try {            UnzipUtility.unzip(zipFilePath, destDirectory);        } catch (Exception ex) {            ex.printStackTrace();        }    }}

zip目录及子孙目录

package com.artisan.commonUtils.zip;import java.io.FileOutputStream;import java.io.IOException;import java.nio.file.FileVisitResult;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.SimpleFileVisitor;import java.nio.file.attribute.BasicFileAttributes;import java.util.zip.ZipEntry;import java.util.zip.ZipOutputStream;/** *  *  * @ClassName: ZipWholeDirAndSubsDir *  * @Description: Using the walk file tree feature of Java NIO, *  *               you can write a program that compresses a whole directory *               (including sub files and sub directories) with ease *  * @author: Mr.Yang *  * @date: 2017年9月7日 下午8:36:18 */public class ZipWholeDirAndSubsDir extends SimpleFileVisitor<Path> {    private static ZipOutputStream zos;    private Path sourceDir;    public ZipWholeDirAndSubsDir(Path sourceDir) {        this.sourceDir = sourceDir;    }    @Override    public FileVisitResult visitFile(Path file, BasicFileAttributes attributes) {        try {            Path targetFile = sourceDir.relativize(file);            zos.putNextEntry(new ZipEntry(targetFile.toString()));            byte[] bytes = Files.readAllBytes(file);            zos.write(bytes, 0, bytes.length);            zos.closeEntry();        } catch (IOException ex) {            System.err.println(ex);        }        return FileVisitResult.CONTINUE;    }    public static void main(String[] args) {        String dirPath = "H:/Sessions";        Path sourceDir = Paths.get(dirPath);        try {            String zipFileName = dirPath.concat(".zip");            zos = new ZipOutputStream(new FileOutputStream(zipFileName));            Files.walkFileTree(sourceDir, new ZipWholeDirAndSubsDir(sourceDir));            zos.close();        } catch (IOException ex) {            System.err.println("I/O Error: " + ex);        }    }}

不解压读取zip中的文件列表

package com.artisan.commonUtils.zip;import java.io.IOException;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;/** *  *  * @ClassName: ReadContentFromZipFile *  * @Description: Reading content of a ZIP file means that you list all entries *               contained in the file without extracting them. *  *  *               In the java.util.zip package, the ZipFile class can be used to *               open and read a ZIP file like this: *  *               ZipFile zipFile = new ZipFile(zipFilePath); Enumeration<? *               extends ZipEntry> entries = zipFile.entries(); *  *  *               Each entry is of type ZipEntry which provides the following *               methods for reading information of an individual entry (to name *               a few): *  *               getName(): returns the name of the entry in form of a relative *               path *  *               getComment(): returns comment of the entry getCompressedSize(): *               returns the compressed size of the entry in bytes. *  *               getSize(): returns the normal size (uncompressed) of the entry *               in bytes. *  *               isDirectory(): tells whether the entry is a directory or not. *  * @author: Mr.Yang *  * @date: 2017年9月7日 下午8:38:59 */public class ReadContentFromZipFile {    /**     *      *      * @Title: readContentFromZipFile     *      * @Description: TODO     *      * @param zipFilePath     *      * @return: void     */    public static void readContentFromZipFile(String zipFilePath) {        try {            ZipFile zipFile = new ZipFile(zipFilePath);            Enumeration<? extends ZipEntry> entries = zipFile.entries();            while (entries.hasMoreElements()) {                ZipEntry entry = entries.nextElement();                String name = entry.getName();                long compressedSize = entry.getCompressedSize();                long normalSize = entry.getSize();                String type = entry.isDirectory() ? "DIR" : "FILE";                System.out.println(name);                System.out.format("\t %s - %d - %d\n", type, compressedSize, normalSize);            }            zipFile.close();        } catch (IOException ex) {            System.err.println(ex);        }    }    public static void main(String[] args) {        ReadContentFromZipFile.readContentFromZipFile("D:\\test.zip");    }}
原创粉丝点击