最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件

 更新時(shí)間:2022年12月12日 09:27:30   作者:yujkss  
這篇文章主要介紹了Java如何實(shí)現(xiàn)壓縮文件與解壓縮zip文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java壓縮文件與解壓縮zip文件

在日常的使用中經(jīng)常會(huì)使用到像WinRAR或WinZIP這樣的壓縮文件,通過這些軟件可以把一個(gè)很大的文件進(jìn)行壓縮以方便傳輸。

在JAVA中 為了減少傳輸時(shí)的數(shù)據(jù)量也提供了專門的壓縮流,可以將文件或文件夾壓縮成ZIP、JAR、GZIP等文件的格式。

ZIP是一種較為常見的壓縮形式,在Java中要想實(shí)現(xiàn)ZIP的壓縮需要導(dǎo)入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry幾個(gè)類完成。

testZip

package com.kuang.zip;

import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class testZip {


    public static void unZipIt(String file, String outputFolder) throws IOException {

        ZipFile zipFile = null;
        InputStream in=null;
        OutputStream out=null;
        try {
            zipFile = new ZipFile(file);
            Enumeration <? extends ZipEntry>  entries = zipFile.entries();
            while (entries.hasMoreElements()) {
                ZipEntry entry = entries.nextElement();
                File entryDestination = new File(outputFolder, entry.getName());
                if (entry.isDirectory()) {
                    entryDestination.mkdirs();
                } else {
                    entryDestination.getParentFile().mkdirs();
                    try {
                        out = new FileOutputStream(entryDestination);
                        in = zipFile.getInputStream(entry);
                        IOUtils.copy(in, out);
                    } catch (IOException e) {
                        throw e;
                    }finally {
                        IOUtils.closeQuietly(in);
                        IOUtils.closeQuietly(out);
                    }
                }
            }
        } finally {
            try {
                if(zipFile!=null){zipFile.close();zipFile=null;}
            } catch (IOException e) {
            }
        }
    }

    public static void main(String[] args) throws Exception {

        unZipIt("D:\\Test\\TestbyYTT.zip","D:\\Test\\");

    }

}

org.apache.commons.io.IOUtils需引入maven依賴

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

org.apache.commons.io.IOUtils.closeQuietly()只是確保流會(huì)被關(guān)閉,無論流是否正常結(jié)束,看源碼發(fā)現(xiàn)closeQuietly它會(huì)忽略異常


那么為什么IOUtils.closeQuietly()會(huì)在2.6的時(shí)候?qū)⑺鼧?biāo)記為過時(shí)呢?

因?yàn)镴ava7里的try-with-resource語法糖的出現(xiàn),之前定義在try catch外部的流移到了try后邊的括號(hào)里,不再需要手動(dòng)關(guān)閉了,它會(huì)自行處理。

public static void readAll() {
    try (
        FileReader fileReader = new FileReader("test");
        BufferedReader bufferedReader = new BufferedReader(fileReader)
    ) {
        String line;

        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

拓展:還有一種語法叫multi-catch 可以簡(jiǎn)化多個(gè)catch

FileZip

package com.kuang.zip;

import java.io.*;
import java.util.zip.*;
import java.util.zip.ZipEntry;


public class FileZip {
    /**
     * zip文件壓縮
     * @param inputFile 待壓縮文件夾/文件名
     * @param outputFile 生成的壓縮包名字
     */

    public static void ZipCompress(String inputFile, String outputFile) throws Exception {
        //創(chuàng)建zip輸出流
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(outputFile));
        //創(chuàng)建緩沖輸出流
        BufferedOutputStream bos = new BufferedOutputStream(out);
        File input = new File(inputFile);
        compress(out, bos, input,null);
        bos.close();
        out.close();
    }
    /**
     * @param name 壓縮文件名,可以寫為null保持默認(rèn)
     */
    //遞歸壓縮
    public static void compress(ZipOutputStream out, BufferedOutputStream bos, File input, String name) throws IOException {
        if (name == null) {
            name = input.getName();
        }
        //如果路徑為目錄(文件夾)
        if (input.isDirectory()) {
            //取出文件夾中的文件(或子文件夾)
            File[] flist = input.listFiles();

            if (flist.length == 0)//如果文件夾為空,則只需在目的地zip文件中寫入一個(gè)目錄進(jìn)入
            {
                out.putNextEntry(new ZipEntry(name + "/"));
            } else//如果文件夾不為空,則遞歸調(diào)用compress,文件夾中的每一個(gè)文件(或文件夾)進(jìn)行壓縮
            {
                for (int i = 0; i < flist.length; i++) {
                    compress(out, bos, flist[i], name + "/" + flist[i].getName());
                }
            }
        } else//如果不是目錄(文件夾),即為文件,則先寫入目錄進(jìn)入點(diǎn),之后將文件寫入zip文件中
        {
            out.putNextEntry(new ZipEntry(name));
            FileInputStream fos = new FileInputStream(input);
            BufferedInputStream bis = new BufferedInputStream(fos);
            int len=-1;
            //將源文件寫入到zip文件中
            byte[] buf = new byte[1024];
            while ((len = bis.read(buf)) != -1) {
                bos.write(buf,0,len);
            }
            bis.close();
            fos.close();
        }
    }

    /**
     * zip解壓
     * @param inputFile 待解壓文件名
     * @param destDirPath  解壓路徑
     */

    public static void ZipUncompress(String inputFile,String destDirPath) throws Exception {
        File srcFile = new File(inputFile);//獲取當(dāng)前壓縮文件
        // 判斷源文件是否存在
        if (!srcFile.exists()) {
            throw new Exception(srcFile.getPath() + "所指文件不存在");
        }
        //開始解壓
        //構(gòu)建解壓輸入流
        ZipInputStream zIn = new ZipInputStream(new FileInputStream(srcFile));
        ZipEntry entry = null;
        File file = null;
        while ((entry = zIn.getNextEntry()) != null) {
            if (!entry.isDirectory()) {
                file = new File(destDirPath, entry.getName());
                if (!file.exists()) {
                    new File(file.getParent()).mkdirs();//創(chuàng)建此文件的上級(jí)目錄
                }
                OutputStream out = new FileOutputStream(file);
                BufferedOutputStream bos = new BufferedOutputStream(out);
                int len = -1;
                byte[] buf = new byte[1024];
                while ((len = zIn.read(buf)) != -1) {
                    bos.write(buf, 0, len);
                }
                // 關(guān)流順序,先打開的后關(guān)閉
                bos.close();
                out.close();
            }
        }
    }


    public static void main(String[] args) {
        try {

            ZipCompress("D:\\Test", "D:\\Test\\TestbyYTT.zip");
            ZipUncompress("D:\\Test\\TestbyYTT.zip","D:\\Test\\TestbyYTT的解壓文件");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA2020如何打開Run Dashboard的方法步驟

    IDEA2020如何打開Run Dashboard的方法步驟

    這篇文章主要介紹了IDEA2020如何打開Run Dashboard的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解MyBatisPlus如何實(shí)現(xiàn)分頁和查詢操作

    詳解MyBatisPlus如何實(shí)現(xiàn)分頁和查詢操作

    這篇文章主要為大家詳細(xì)介紹了MyBatisPlus是如何實(shí)現(xiàn)分頁和查詢操作的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • Java?HashSet添加?遍歷元素源碼分析

    Java?HashSet添加?遍歷元素源碼分析

    這篇文章主要為大家詳細(xì)介紹了HashSet、HashMap底層添加、遍歷元素的機(jī)制,追蹤并分析源碼,文中的示例代碼講解詳細(xì),希望對(duì)大學(xué)有所幫助
    2022-07-07
  • Java基于字符界面的簡(jiǎn)易收銀臺(tái)

    Java基于字符界面的簡(jiǎn)易收銀臺(tái)

    這篇文章主要為大家詳細(xì)介紹了Java基于字符界面的簡(jiǎn)易收銀臺(tái),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系

    詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系

    這篇文章主要介紹了詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系,本文先對(duì)兩種方法作了介紹,然后對(duì)二者聯(lián)系進(jìn)行分析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java中ArrayList初始化的四種方法詳解

    Java中ArrayList初始化的四種方法詳解

    這篇文章主要介紹了Java中ArrayList初始化的四種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • classpath和classpath*的區(qū)別詳解

    classpath和classpath*的區(qū)別詳解

    這篇文章主要為大家介紹了classpath和classpath*的區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • java面試常見問題之Hibernate總結(jié)

    java面試常見問題之Hibernate總結(jié)

    這篇文章主要介紹了在java面試過程中hibernate比較常見的問題,包括Hibernate的檢索方式,Hibernate中對(duì)象的狀態(tài),Hibernate的3種檢索策略是什么,Session的find()方法以及Query接口的區(qū)別等方面問題的總結(jié),需要的朋友可以參考下
    2015-07-07
  • 詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)

    這篇文章主要介紹了詳解在spring boot中消息推送系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • Java 位圖法排序的使用方法

    Java 位圖法排序的使用方法

    本篇文章,小編將為大家介紹關(guān)于Java 位圖法排序的使用方法,有需要的朋友可以參考一下
    2013-04-04

最新評(píng)論

江陵县| 广西| 甘谷县| 呼和浩特市| 潜山县| 应用必备| 武穴市| 将乐县| 三亚市| 固安县| 新乡县| 南木林县| 射洪县| 晋州市| 霞浦县| 邵阳市| 昆明市| 华池县| 灯塔市| 长阳| 葵青区| 松溪县| 乳山市| 昔阳县| 林甸县| 张家口市| 安徽省| 无为县| 梨树县| 库车县| 贵南县| 漾濞| 贵阳市| 南部县| 长岛县| 刚察县| 临桂县| 高碑店市| 万州区| 正镶白旗| 临武县|