java壓縮與解壓

一 概述

1.目錄進入點

目錄進入點是文件在壓縮文件中的映射,表明壓縮文件。壓縮文件時,建立目錄進入點,將文件寫入該目錄進入點。解壓時,獲取目錄進入點,將該目錄進入點的內容寫入硬盤指定文件。java

若是目錄進入點是一個文件夾,在命名時必須以路徑分隔符結尾,在Window操做系統中名稱分隔符爲「/」。spa

2.文件的自動建立

不管是調用createNewFile()建立文件,仍是在建立輸出流時由輸出流負責建立文件,都必須保證父路徑已經存在,不然文件沒法建立。操作系統

3.目錄的建立

  • mkdirs():建立多級目錄。
  • mkdir():建立一級目錄,若是父路徑不存在,建立失敗。

二 壓縮

1.建立目錄進入點

首先爲文件或者文件夾建立目錄進入點,目錄進入點的名稱爲當前文件相對於壓縮文件的路徑,文件夾的目錄進入點名稱必須以名稱分隔符結尾,以區別於文件。3d

ZipEntry entry = new ZipEntry(壓縮文件夾名稱 + File.separator+文件或文件夾路徑);

2.寫入目錄進入點

使用ZipOutputStream輸出流將文件寫入對應目錄進入點中,寫入完成,關閉目錄進入點。code

3.Demo

package com.javase.io;

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;

public class ZipUtils {

    /**
     * 壓縮一個文件夾
     * 
     * @throws IOException
     */
    public void zipDirectory(String path) throws IOException {
        File file = new File(path);
        String parent = file.getParent();
        File zipFile = new File(parent, file.getName() + ".zip");
        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
        zip(zos, file, file.getName());
        zos.flush();
        zos.close();
    }

    /**
     * 
     * @param zos
     *            壓縮輸出流
     * @param file
     *            當前須要壓縮的文件
     * @param path
     *            當前文件相對於壓縮文件夾的路徑
     * @throws IOException
     */
    private void zip(ZipOutputStream zos, File file, String path) throws IOException {
        // 首先判斷是文件,仍是文件夾,文件直接寫入目錄進入點,文件夾則遍歷
        if (file.isDirectory()) {
            ZipEntry entry = new ZipEntry(path + File.separator);// 文件夾的目錄進入點必須以名稱分隔符結尾
            zos.putNextEntry(entry);
            File[] files = file.listFiles();
            for (File x : files) {
                zip(zos, x, path + File.separator + x.getName());
            }
        } else {
            FileInputStream fis = new FileInputStream(file);// 目錄進入點的名字是文件在壓縮文件中的路徑
            ZipEntry entry = new ZipEntry(path);
            zos.putNextEntry(entry);// 創建一個目錄進入點

            int len = 0;
            byte[] buf = new byte[1024];
            while ((len = fis.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            zos.flush();
            fis.close();
            zos.closeEntry();// 關閉當前目錄進入點,將輸入流移動下一個目錄進入點
        }
    }

}

三 解壓文件

1.基本思路

解壓文件時,先獲取壓縮文件中的目錄進入點,根據該目錄進入點建立文件對象,將目錄進入點的內容寫入硬盤文件中。對象

2.Demo

package com.javase.io;

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;

public class ZipUtils {private String basePath;

    /**
     * 解壓文件
     * 
     * @param unzip
     * @throws IOException
     */
    public void unzip(String unzip) throws IOException {
        File file = new File(unzip);
        basePath = file.getParent();
        FileInputStream fis = new FileInputStream(file);
        ZipInputStream zis = new ZipInputStream(fis);
        unzip(zis);
    }

    private void unzip(ZipInputStream zis) throws IOException {
        ZipEntry entry = zis.getNextEntry();
        if (entry != null) {
            File file = new File(basePath + File.separator + entry.getName());
            if (file.isDirectory()) {
                // 可能存在空文件夾
                if (!file.exists())
                    file.mkdirs();
                unzip(zis);
            } else {
                File parentFile = file.getParentFile();
                if (parentFile != null && !parentFile.exists())
                    parentFile.mkdirs();
                FileOutputStream fos = new FileOutputStream(file);// 輸出流建立文件時必須保證父路徑存在
                int len = 0;
                byte[] buf = new byte[1024];
                while ((len = zis.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                fos.flush();
                fos.close();
                zis.closeEntry();
                unzip(zis);
            }
        }
    }

}
相關文章
相關標籤/搜索