java壓縮與解壓

来源:http://www.cnblogs.com/tonghun/archive/2017/07/16/7189227.html
-Advertisement-
Play Games

一 概述 1.目錄進入點 目錄進入點是文件在壓縮文件中的映射,代表壓縮文件。壓縮文件時,創建目錄進入點,將文件寫入該目錄進入點。解壓時,獲取目錄進入點,將該目錄進入點的內容寫入硬碟指定文件。 如果目錄進入點是一個文件夾,在命名時必須以路徑分隔符結尾,在Window操作系統中名稱分隔符為“/”。 2. ...


一 概述

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

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 走向開源! 這博客五月份做完,直到今天才發佈的原因是之前伺服器到期了,資料庫丟失沒有備份又重搞的才搞完也,每次想開放出來,讓更多人知道和提出寶貴建議,都會覺得自己的東西並不是那麼好,直到今天,我才覺得程式這東西,只有更多人體驗和反饋才會更好。 我始終不相信這世界上有這麼一句話:已經沒有比這更好的東西 ...
  • 上篇地址 :http://www.cnblogs.com/chinxi/p/7185309.html 有了一條會移動的“蛇”,就可以開始寫改變它方向的方法了。 由於這是運行在linux下的,沒有像windows下的getch()方法,想要輸入一個鍵,不輸入回車,就讓程式有響應,還是件麻煩事。 不過, ...
  • 在使用mybatis進行資料庫連接操作時對於SQL語句返回結果的處理通常有兩種方式,一種就是resultType另一種就是resultMap,下麵說下我對這兩者的認識和理解 比如,我們平時使用的單表查詢,很多時候使用的就是resultType 下來,看一段代碼吧 上面的PO類我使用的是我的一個小De ...
  • Java 是1995年SUN公司推出的一門高級編程語言,是面向互聯網的語言,WEB應用程式首選的語言(安卓底層,大數據hadoop框架用java編寫,Spark用Scala編寫,Scala用java寫的),(相對其他語言)簡單易學、安全可靠、完全面向對象、跨平臺(操作系統,完全忽略操作系統,寫完後任 ...
  • 第1種方法: //setSize(300, 200); pack(); // 得到顯示器屏幕的寬、高 int width = Toolkit.getDefaultToolkit().getScreenSize().width; int height = Toolkit.getDefaultToolk ...
  • 題目背景 全場基本暴力 題目描述 輸入輸出格式 輸入格式: 如圖 輸出格式: 如圖 輸入輸出樣例 輸入樣例#1: 如圖 輸出樣例#1: 如圖 輸入樣例#1: 如圖 輸出樣例#1: 如圖 說明 如圖 這題用到了容斥原理和線性篩的一些東西, 表示沒怎麼看懂、。。。 ...
  • 在web開發中,靜態資源的訪問是必不可少的,如:圖片、js、css 等資源的訪問。 spring Boot 對靜態資源訪問提供了很好的支持,基本使用預設配置就能滿足開發需求。 一、預設靜態資源映射 Spring Boot 對靜態資源映射提供了預設配置 Spring Boot 預設將 / 所有訪問映射 ...
  • 在使用spring boot過程中,可以發現項目中只需要極少的配置就能完成相應的功能,這歸功於spring boot中的模塊化配置,在pom.xml中依賴的每個Starter都有預設配置,而這些預設配置足以滿足正常的功能開發。 如果需要修改自定義修改預設配置,spring boot 提供了很簡便的方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...