讀取zip文件,不解壓縮直接解析,支持文件名中文,解決內容亂碼


使用ant.jar進行文件zip壓縮

 

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.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;

/**
 * 功能: 
 * 1 、實現把指定文件夾下的所有文件壓縮為指定文件夾下指定 zip 文件 
 * 2 、實現把指定文件夾下的 zip 文件解壓到指定目錄下
 */

public class ZipUtils {

    public static void main(String[] args) {

        zip ("D:\\zip測試", "D:\\測試結果.zip");

        unZip("D:\\測試結果.zip", "D:\\解壓結果");

    }

    /**
     * 功能:把 sourceDir 目錄下的所有文件進行 zip 格式的壓縮,保存為指定 zip 文件
     * @param sourceDir
     * @param zipFile
     */

    public static void zip(String sourceDir, String zipFile) {

        OutputStream os;

        try {

            os = new FileOutputStream(zipFile);

            BufferedOutputStream bos = new BufferedOutputStream(os);

            ZipOutputStream zos = new ZipOutputStream(bos);

            File file = new File(sourceDir);

            String basePath = null;

            if (file.isDirectory()) {

                basePath = file.getPath();

            } else {//直接壓縮單個文件時,取父目錄

                basePath = file.getParent();

            }

            zipFile(file, basePath, zos);

            zos.closeEntry();

            zos.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**
     * 功能:執行文件壓縮成zip文件
     * @param source
     * @param basePath  待壓縮文件根目錄
     * @param zos
     */

    private static void zipFile(File source, String basePath,

    ZipOutputStream zos) {

        File[] files = new File[0];

        if (source.isDirectory()) {

            files = source.listFiles();

        } else {

            files = new File[1];

            files[0] = source;

        }

        String pathName;//存相對路徑(相對於待壓縮的根目錄)

        byte[] buf = new byte[1024];

        int length = 0;

        try {

            for (File file : files) {

                if (file.isDirectory()) {

                    pathName = file.getPath().substring(basePath.length() + 1)

                    + "/";

                    zos.putNextEntry(new ZipEntry(pathName));
                    
                    zipFile(file, basePath, zos);

                } else {

                    pathName = file.getPath().substring(basePath.length() + 1);

                    InputStream is = new FileInputStream(file);

                    BufferedInputStream bis = new BufferedInputStream(is);

                    zos.putNextEntry(new ZipEntry(pathName));

                    while ((length = bis.read(buf)) > 0) {

                        zos.write(buf, 0, length);

                    }

                    is.close();

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**
     * 功能:解壓 zip 文件,只能解壓 zip 文件
     * @param zipfile
     * @param destDir
     */

    public static void unZip(String zipfile, String destDir) {

        destDir = destDir.endsWith("\\") ? destDir : destDir + "\\";

        byte b[] = new byte[1024];

        int length;

        ZipFile zipFile;

        try {

            zipFile = new ZipFile(new File(zipfile));

            Enumeration enumeration = zipFile.getEntries();

            ZipEntry zipEntry = null;

            while (enumeration.hasMoreElements()) {

                zipEntry = (ZipEntry) enumeration.nextElement();

                File loadFile = new File(destDir + zipEntry.getName());

                if (zipEntry.isDirectory()) {

                    loadFile.mkdirs();

                } else {

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

                        loadFile.getParentFile().mkdirs();
                        
                    }

                    OutputStream outputStream = new FileOutputStream(loadFile);

                    InputStream inputStream = zipFile.getInputStream(zipEntry);

                    while ((length = inputStream.read(b)) > 0)

                        outputStream.write(b, 0, length);

                }

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM