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

java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解

 更新時(shí)間:2024年12月25日 09:11:42   作者:小學(xué)雞!  
這篇文章主要給大家介紹了關(guān)于java打包文件成zip、壓縮文件及file.mkdir和mkdirs區(qū)別詳解的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、file.mkdir 和 mkdirs 的區(qū)別

在 Java 中,File 類提供了兩個(gè)方法用于創(chuàng)建目錄:mkdir() 和 mkdirs()。它們的作用有一些關(guān)鍵區(qū)別:

① file.mkdir()

創(chuàng)建單級(jí)目錄。

  • 當(dāng)有多層目錄時(shí),只有在父目錄已存在的情況下,才能創(chuàng)建最后的目錄。

  • 假如只有一層目錄,則可以創(chuàng)建。

  • 返回 true 表示目錄創(chuàng)建成功,返回 false 表示創(chuàng)建失?。ɡ?,如果父目錄不存在或目錄已存在)。

② file.mkdirs()

創(chuàng)建多級(jí)目錄,包括不存在的父目錄。

  • 如果任何中間目錄不存在,mkdirs() 會(huì)遞歸創(chuàng)建所有必要的父目錄。

  • 返回值:返回 true 表示目錄及其父目錄創(chuàng)建成功,返回 false 表示創(chuàng)建失敗。

舉例:

File dir = new File("C:\\parentDir\\subDir\\newDir");
boolean created = dir.mkdir(); // 如果 parentDir 或 subDir 不存在,則創(chuàng)建失敗
boolean created = dir.mkdirs(); // 會(huì)創(chuàng)建 parentDir 和 subDir,如果它們不存在

二、文件打包成zip

Java 提供了豐富的標(biāo)準(zhǔn)庫(kù)用于處理 ZIP 文件,其中最主要的是 java.util.zip 包。該包包含了一系列類和接口,用于創(chuàng)建、讀取和操作 ZIP 文件。常用的類包括:

  • ZipInputStream 和 ZipOutputStream:用于順序讀取和寫(xiě)入 ZIP 文件。
  • ZipFile 和 ZipEntry:用于隨機(jī)訪問(wèn) ZIP 文件中的條目。

1. 壓縮單個(gè)文件

在 Java 中實(shí)現(xiàn)文件打包成 zip 的過(guò)程可以分為以下幾個(gè)步驟:

創(chuàng)建一個(gè) ZipOutputStream 對(duì)象 ---- 使用 ZipEntry 將文件添加到 zip 包中 ---- 將文件內(nèi)容寫(xiě)入到 ZipOutputStream 中 ---- 關(guān)閉 ZipOutputStream 對(duì)象

示例:將桌面上的 12.txt 打包成 zip

public class Test {
    public static void main(String[] args) {
        //文件所在的位置
        String filePath = "C:\\Users\\ASUS\\Desktop\\12.txt";
        //壓縮后文件存放的位置
        String zipFilePath = "C:\\Users\\ASUS\\Desktop\\12.zip";

        //使用try-with-resources語(yǔ)句來(lái)確保流在使用后正確關(guān)閉
        try (
                FileInputStream fileInputStream = new FileInputStream(filePath);
                //創(chuàng)建ZipOutputStream對(duì)象
                FileOutputStream fileOutputStream = new FileOutputStream(zipFilePath);
                ZipOutputStream zipOutputStream = new ZipOutputStream(fileOutputStream)
        ) {

            //使用ZipEntry將文件添加到zip包中:表示要添加到zip包中的文件名為"12.txt"
            ZipEntry zipEntry = new ZipEntry("12.txt");
            zipOutputStream.putNextEntry(zipEntry);

            //將文件內(nèi)容寫(xiě)入到ZipOutputStream中
            byte[] buffer = new byte[1024];
            int len;
            while ((len = fileInputStream.read(buffer)) != -1) {
                zipOutputStream.write(buffer, 0, len);
            }
            zipOutputStream.closeEntry();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
	}
}

注意:

① zipOutputStream.closeEntry():用來(lái)關(guān)閉當(dāng)前正在寫(xiě)入的 ZipEntry,表示結(jié)束這個(gè)條目(條目:文件或文件夾)的寫(xiě)入過(guò)程。

zipOutputStream.close():在 try-with-resources 結(jié)束時(shí)自動(dòng)調(diào)用,是關(guān)閉整個(gè) ZipOutputStream,釋放資源。

② ZipEntry中指定的應(yīng)該是 ZIP 文件內(nèi)部的文件名,而不是完整路徑。若是完整路徑(ZipEntry zipEntry = new ZipEntry("C:\\Users\\ASUS\\Desktop\\12.txt")),這可能導(dǎo)致 ZIP 包內(nèi)部出現(xiàn)意料之外的文件結(jié)構(gòu):

2. 壓縮多個(gè)文件和文件夾

案例:現(xiàn)在有個(gè)文件,樣式為下圖,需要壓縮。

按照正常思路就是遍歷文件夾:

public class Test {
    public static void main(String[] args) {
        
        //文件位置
        String filePath = "C:\\Users\\ASUS\\Desktop\\11";
        //輸出位置
        String zipFilePath = "C:\\Users\\ASUS\\Desktop\\11.zip";

        try (
                FileOutputStream fos = new FileOutputStream(zipFilePath);
                ZipOutputStream zos = new ZipOutputStream(fos)
        ) {
            //創(chuàng)建文件對(duì)象
            File file = new File(filePath);
            //調(diào)方法:開(kāi)始遞歸添加文件和文件夾
            zipFile(file, file.getName(), zos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void zipFile(File file, String fileName, ZipOutputStream zos) {
        if (file.isDirectory()) {
            File[] children = file.listFiles();
            for (File child : children) {
                zipFile(child, child.getName(), zos);
            }
        }
        try (
                FileInputStream fileInputStream = new FileInputStream(file)
        ) {
            ZipEntry zipEntry = new ZipEntry(fileName);
            zos.putNextEntry(zipEntry);

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fileInputStream.read(buffer)) != -1) {
                zos.write(buffer, 0, len);
            }
            zos.closeEntry();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

問(wèn)題:只是壓縮了文件,原本的目錄結(jié)構(gòu)沒(méi)有保留,如下:

解決:

public class Test {
    public static void main(String[] args) {
        
        //文件位置
        String filePath = "C:\\Users\\ASUS\\Desktop\\11";
        //輸出位置
        String zipFilePath = "C:\\Users\\ASUS\\Desktop\\11.zip";

        try (
                FileOutputStream fos = new FileOutputStream(zipFilePath);
                ZipOutputStream zos = new ZipOutputStream(fos)
        ) {
            //創(chuàng)建文件對(duì)象
            File file = new File(filePath);
            //調(diào)方法:開(kāi)始遞歸添加文件和文件夾
            //file.getName:獲取文件名,包括文件名后綴
            zipFile(file, file.getName(), zos);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void zipFile(File file, String fileName, ZipOutputStream zos) {
        if (file.isDirectory()) {
            /*
            假如是個(gè)空文件夾,下面這個(gè):
             zos.putNextEntry(new ZipEntry(fileName + "/"));
            就是為了保留空文件夾
             */
            try {
                zos.putNextEntry(new ZipEntry(fileName + "/"));
                zos.closeEntry();
            } catch (Exception e) {
                e.printStackTrace();
            }

            File[] children = file.listFiles();
            //確保目錄不是空的
            if (children != null) {
                for (File child : children) {
                    //加 fileName + "/" 是為了保留原始的目錄結(jié)構(gòu)
                    zipFile(child, fileName + "/" + child.getName(), zos);
                }
            }
            return;
        }

        try (
                FileInputStream fileInputStream = new FileInputStream(file)
        ) {
            ZipEntry zipEntry = new ZipEntry(fileName);
            zos.putNextEntry(zipEntry);

            byte[] buffer = new byte[1024];
            int len;
            while ((len = fileInputStream.read(buffer)) != -1) {
                zos.write(buffer, 0, len);
            }
            zos.closeEntry();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
       
}

代碼分析:

① 為什么是/,而不是\

在 ZIP 文件的規(guī)范中,路徑分隔符始終使用正斜杠 /,而不是反斜杠 \

② 為什么 return?

否則會(huì)報(bào)錯(cuò):java.io.FileNotFoundException: C:\Users\ASUS\Desktop\11\22\33 (拒絕訪問(wèn)),因?yàn)?nbsp;FileInputStream 只能用于讀取文件,而不能用于讀取目錄。如果代碼試圖將目錄作為 FileInputStream 的輸入,會(huì)報(bào) FileNotFoundException。

因?yàn)槭沁f歸調(diào)用,但遞歸結(jié)束時(shí),開(kāi)始返回調(diào)用棧,調(diào)用并繼續(xù)執(zhí)行剩余的代碼(所以會(huì)報(bào)錯(cuò),涉及到遞歸調(diào)用的邏輯)

總結(jié)

到此這篇關(guān)于java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解的文章就介紹到這了,更多相關(guān)java打包文件成zip壓縮文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA讀取PDF、WORD文檔實(shí)例代碼

    JAVA讀取PDF、WORD文檔實(shí)例代碼

    本篇文章主要通過(guò)實(shí)例代碼介紹了JAVA讀取PDF、WORD文檔,需要的朋友可以參考下
    2017-04-04
  • scala當(dāng)中的文件操作和網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法

    scala當(dāng)中的文件操作和網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法

    這篇文章主要介紹了scala當(dāng)中的文件操作和網(wǎng)絡(luò)請(qǐng)求的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java實(shí)現(xiàn)dijkstra最短路徑尋路算法

    java實(shí)現(xiàn)dijkstra最短路徑尋路算法

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)dijkstra最短路徑尋路算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Spring5路徑匹配器PathPattern解析

    Spring5路徑匹配器PathPattern解析

    這篇文章主要介紹了Spring5路徑匹配器PathPattern,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java中創(chuàng)建對(duì)象的6種方式

    Java中創(chuàng)建對(duì)象的6種方式

    大家好,本篇文章主要講的是Java中創(chuàng)建對(duì)象的6種方式,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下的相關(guān)資料
    2022-02-02
  • Java?獲取Zookeeper節(jié)點(diǎn)下所有數(shù)據(jù)詳細(xì)步驟

    Java?獲取Zookeeper節(jié)點(diǎn)下所有數(shù)據(jù)詳細(xì)步驟

    本文介紹了如何使用Java獲取ZooKeeper節(jié)點(diǎn)下所有數(shù)據(jù),實(shí)際應(yīng)用示例中,我們演示了如何從ZooKeeper節(jié)點(diǎn)下獲取配置信息并輸出到控制臺(tái),ZooKeeper是一個(gè)開(kāi)源的分布式協(xié)調(diào)服務(wù),適用于分布式系統(tǒng)中的數(shù)據(jù)同步、配置管理、命名服務(wù)等功能,感興趣的朋友一起看看吧
    2024-11-11
  • Mybatis實(shí)現(xiàn)動(dòng)態(tài)建表代碼實(shí)例

    Mybatis實(shí)現(xiàn)動(dòng)態(tài)建表代碼實(shí)例

    這篇文章主要介紹了Mybatis實(shí)現(xiàn)動(dòng)態(tài)建表代碼實(shí)例,解釋一下,就是指根據(jù)傳入的表名,動(dòng)態(tài)地創(chuàng)建數(shù)據(jù)庫(kù)表,以供后面的業(yè)務(wù)場(chǎng)景使用,
    而使用 Mybatis 的動(dòng)態(tài) SQL,就能很好地為我們解決這個(gè)問(wèn)題,需要的朋友可以參考下
    2023-10-10
  • J2EE Servlet基礎(chǔ)在瀏覽器上運(yùn)行HelloServlet的方法

    J2EE Servlet基礎(chǔ)在瀏覽器上運(yùn)行HelloServlet的方法

    這篇文章主要介紹了J2EE Servlet基礎(chǔ)在瀏覽器上運(yùn)行HelloServlet的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python單元測(cè)試_使用裝飾器實(shí)現(xiàn)測(cè)試跳過(guò)和預(yù)期故障的方法

    Python單元測(cè)試_使用裝飾器實(shí)現(xiàn)測(cè)試跳過(guò)和預(yù)期故障的方法

    下面小編就為大家?guī)?lái)一篇Python單元測(cè)試_使用裝飾器實(shí)現(xiàn)測(cè)試跳過(guò)和預(yù)期故障的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java實(shí)現(xiàn)圖形化界面的日歷

    Java實(shí)現(xiàn)圖形化界面的日歷

    這篇文章主要介紹了Java實(shí)現(xiàn)圖形化界面的日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

库伦旗| 石渠县| 泾源县| 隆尧县| 新邵县| 武冈市| 蕲春县| 山东| 辽中县| 柳林县| 蕉岭县| 苗栗市| 灵川县| 岚皋县| 黔西县| 海门市| 丹寨县| 长丰县| 裕民县| 洮南市| 张家港市| 剑川县| 老河口市| 米林县| 龙井市| 崇仁县| 中山市| 宜春市| 汨罗市| 阿拉善右旗| 沙河市| 城市| 鲁甸县| 红河县| 锡林郭勒盟| 抚州市| 福安市| 曲周县| 桂阳县| 福清市| 普安县|