首頁  >  文章  >  Java  >  java中的壓縮與解壓縮實例

java中的壓縮與解壓縮實例

零下一度
零下一度原創
2017-07-16 17:02:181596瀏覽

     在開發過程中,有時需要對檔案進行一個壓縮操作,以節省硬碟空間,那麼用Java怎麼實現檔案的壓縮與解壓縮呢?很簡單,Java為我們提供了一個包,專門負責文件的壓縮與解壓的,那個包就是java.util.zip; (注意:這個包有個非常蛋疼的地方,中文路徑會出現亂碼)

那麼如何解決這個亂碼問題:只需要使用apache的ant.jar這個架包就行了,代碼不會變,如果你用原生JDK寫的,那麼只需更換導入包就好

1.目錄進入點

目錄進入點是檔案在壓縮檔案中的映射,代表壓縮檔案。壓縮檔案時,建立目錄進入點,將檔案寫入該目錄進入點。解壓縮時,取得目錄進入點,將該目錄進入點的內容寫入硬碟指定檔。

如果目錄進入點是資料夾,在命名時必須以路徑分隔符號結尾,在Window作業系統中名稱分隔符號為「/」。

2.文件的自動建立

無論是呼叫createNewFile()建立文件,或是在建立輸出流時由輸出流負責創建文件,都必須保證父路徑已經存在,否則文件無法建立。

3.目錄的建立

  • #mkdirs():建立多層目錄。

  • mkdir():建立一級目錄,如果父路徑不存在,建立失敗。

二壓縮

#1.建立目錄進入點

首先為檔案或資料夾建立目錄進入點,目錄進入點的名稱為目前檔案相對於壓縮檔案的路徑,資料夾的目錄進入點名稱必須以名稱分隔符號結尾,以區別於檔案。


ZipEntry entry = new ZipEntry(压缩文件夹名称 + File.separator+文件或文件夹路径);

2.寫入目錄進入點

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

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);
            }
        }
    }

}

 

以上是java中的壓縮與解壓縮實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn