java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解
一、file.mkdir 和 mkdirs 的區(qū)別
在 Java 中,File 類提供了兩個方法用于創(chuàng)建目錄:mkdir() 和 mkdirs()。它們的作用有一些關(guān)鍵區(qū)別:
① file.mkdir()
創(chuàng)建單級目錄。
當有多層目錄時,只有在父目錄已存在的情況下,才能創(chuàng)建最后的目錄。
假如只有一層目錄,則可以創(chuàng)建。
返回
true表示目錄創(chuàng)建成功,返回false表示創(chuàng)建失?。ɡ?,如果父目錄不存在或目錄已存在)。
② file.mkdirs()
創(chuàng)建多級目錄,包括不存在的父目錄。
如果任何中間目錄不存在,
mkdirs()會遞歸創(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(); // 會創(chuàng)建 parentDir 和 subDir,如果它們不存在
二、文件打包成zip
Java 提供了豐富的標準庫用于處理 ZIP 文件,其中最主要的是 java.util.zip 包。該包包含了一系列類和接口,用于創(chuàng)建、讀取和操作 ZIP 文件。常用的類包括:
ZipInputStream和ZipOutputStream:用于順序讀取和寫入 ZIP 文件。ZipFile和ZipEntry:用于隨機訪問 ZIP 文件中的條目。
1. 壓縮單個文件
在 Java 中實現(xiàn)文件打包成 zip 的過程可以分為以下幾個步驟:
創(chuàng)建一個 ZipOutputStream 對象 ---- 使用 ZipEntry 將文件添加到 zip 包中 ---- 將文件內(nèi)容寫入到 ZipOutputStream 中 ---- 關(guān)閉 ZipOutputStream 對象
示例:將桌面上的 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語句來確保流在使用后正確關(guān)閉
try (
FileInputStream fileInputStream = new FileInputStream(filePath);
//創(chuàng)建ZipOutputStream對象
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)容寫入到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():用來關(guān)閉當前正在寫入的 ZipEntry,表示結(jié)束這個條目(條目:文件或文件夾)的寫入過程。
zipOutputStream.close():在 try-with-resources 結(jié)束時自動調(diào)用,是關(guān)閉整個 ZipOutputStream,釋放資源。
② ZipEntry中指定的應該是 ZIP 文件內(nèi)部的文件名,而不是完整路徑。若是完整路徑(ZipEntry zipEntry = new ZipEntry("C:\\Users\\ASUS\\Desktop\\12.txt")),這可能導致 ZIP 包內(nèi)部出現(xiàn)意料之外的文件結(jié)構(gòu):

2. 壓縮多個文件和文件夾
案例:現(xiàn)在有個文件,樣式為下圖,需要壓縮。

按照正常思路就是遍歷文件夾:
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)建文件對象
File file = new File(filePath);
//調(diào)方法:開始遞歸添加文件和文件夾
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();
}
}
}
問題:只是壓縮了文件,原本的目錄結(jié)構(gòu)沒有保留,如下:

解決:
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)建文件對象
File file = new File(filePath);
//調(diào)方法:開始遞歸添加文件和文件夾
//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()) {
/*
假如是個空文件夾,下面這個:
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?
否則會報錯:java.io.FileNotFoundException: C:\Users\ASUS\Desktop\11\22\33 (拒絕訪問),因為 FileInputStream 只能用于讀取文件,而不能用于讀取目錄。如果代碼試圖將目錄作為 FileInputStream 的輸入,會報 FileNotFoundException。
因為是遞歸調(diào)用,但遞歸結(jié)束時,開始返回調(diào)用棧,調(diào)用并繼續(xù)執(zhí)行剩余的代碼(所以會報錯,涉及到遞歸調(diào)用的邏輯)
總結(jié)
到此這篇關(guān)于java打包文件成zip、壓縮文件及file.mkdir和mkdirs的區(qū)別詳解的文章就介紹到這了,更多相關(guān)java打包文件成zip壓縮文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何獲取yml文件的自定義參數(shù)
這篇文章主要介紹了springboot如何獲取yml文件的自定義參數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
springboot 返回json格式數(shù)據(jù)時間格式配置方式
這篇文章主要介紹了springboot 返回json格式數(shù)據(jù)時間格式配置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java實戰(zhàn)項目之校園跑腿管理系統(tǒng)的實現(xiàn)
只有理論是不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+vue+maven+elementui+mysql實現(xiàn)一個校園跑腿管理系統(tǒng),大家可以在過程中查缺補漏,提升水平2022-01-01
IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA(或者JetBrains PyCharm)中彈出"IntelliJ IDEA License Activation"的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10
springcloud gateway聚合swagger2的方法示例
這篇文章主要介紹了springcloud gateway聚合swagger2的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04

