Java中mkdir()和mkdirs()的區(qū)別及說明
mkdir()和mkdirs()的區(qū)別
boolean mkdir() : 創(chuàng)建此抽象路徑名指定的目錄。
boolean mkdirs() : 創(chuàng)建此抽象路徑名指定的目錄,包括創(chuàng)建不存在的父目錄。
mkdir:只能用來創(chuàng)建文件夾,且只能創(chuàng)建一級目錄,如果上級不存在,就會創(chuàng)建失敗。
mkdirs:只能用來創(chuàng)建文件夾,且能創(chuàng)建多級目錄 ,如果上級不存在,就會自動創(chuàng)建。(創(chuàng)建文件夾多用此)
Java的mkdir()與mkdirs()引發(fā)的悲劇---java的mkdir()方法無法創(chuàng)建文件目錄
昨晚深夜在做項目的文件上傳,在上傳之前要先判斷指定的文件目錄是否存在,如果不存在就先創(chuàng)建改目錄。
因為之前已經(jīng)做過類似的功能了,所以就把判斷文件目錄以及創(chuàng)建的代碼直接copy過來了,然而很郁悶的是,一模一樣的代碼,這回卻遇到一個特別奇葩的問題:

我要判斷的文件目錄
ServletContext context = ServletActionContext.getServletContext();
// 獲得當前web應用所在目錄下file文件夾的絕對路徑
String path = context.getRealPath("/CloudSpaceFile/CustomerFile/"
+ customerName + "/" + typesName + "/");
File f = new File(path);// 判斷文件夾是否存在,如果不存在就創(chuàng)建
if (!f.exists()) {
f.mkdir();
System.out.println("editCustApplicaAction.add()文件夾不存在------------"+f);
}
boolean t = f.exists();
if (t == true) {
System.out.println("真的//");
}else {
System.out.println("假的的//");
}我之前做的目錄判斷、創(chuàng)建等功能的代碼
ServletContext context = ServletActionContext.getServletContext();
// 獲得當前web應用所在目錄下file文件夾的絕對路徑
String path = context
.getRealPath("/CloudSpaceFile/ResourceFile/SystemApplication/"
+ typesName + "/");
//System.out.println("editCustApplicaAction.add()+++++++++++++++++++"+path);
File f = new File(path);// 判斷文件夾是否存在,如果不存在就創(chuàng)建
if (!f.exists()) {
f.mkdir();
}因為是凌晨了,宿舍斷網(wǎng)了,所以不能查找想要的知識,只能自己琢磨出現(xiàn)這種問題的原因,結果搞了大半天也沒弄清楚原因。
現(xiàn)在查找了資料才知道問題所在:
其中第二次的customerName以及typesName是用戶的用戶名以及他所選擇的文件名,其中 customerName 這個文件目錄之上的目錄已經(jīng)存在的,也就是說,我現(xiàn)在要判斷“****/CloudSpaceFile/CustomerFile/” 這個目錄下的 customerName 這個文件夾是否存在,以及customerName這個文件夾下面的typesName這個文件夾也是否存在(也就是說,這里有可能要創(chuàng)建多層目錄)。
而第一次的的“****/CloudSpaceFile/CustomerFile/”目錄已經(jīng)存在了,要判斷的是“typesName”這個目錄是否存在,也就是說這里只要創(chuàng)建一層目錄。
問題就出在這里?。。。?/strong>
我用創(chuàng)建單層目錄的mkdir()方法去創(chuàng)建多層目錄?。?!
知道問題所在以后就容易解決了:
只要把調(diào)用的方法mkdir()改為mkdirs()就行了。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java 實戰(zhàn)項目錘煉之樸素風格個人博客系統(tǒng)的實現(xiàn)流程
讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個樸素風格的個人博客系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11
MyBatis-Plus TypeHander不生效的問題解決
MyBatis-Plus中使用lambdaUpdate更新JSON字段時,TypeHandler未生效導致數(shù)據(jù)截斷錯誤,需手動轉(zhuǎn)換或顯式指定typeHandler解決,下面就來介紹一下該問題的解決2025-08-08
關于Java實體類Serializable序列化接口的作用和必要性解析
序列化是將對象狀態(tài)轉(zhuǎn)化為可保持或者傳輸?shù)母袷竭^程,與序列化相反的是反序列化,完成序列化和反序列化,可以存儲或傳輸數(shù)據(jù),一般情況下,在定義實體類時會使用Serializable,需要的朋友可以參考下2023-05-05
Java PriorityQueue優(yōu)先級隊列的使用方式
PriorityQueue是一個優(yōu)先級隊列,可以按照優(yōu)先級處理對象,它繼承了Queue接口,底層是一個堆,可以實現(xiàn)大根堆或小根堆,常用方法包括offer、poll、peek、size等,插入元素時需要注意元素不能為null并且必須能夠進行比較,大根堆可以通過傳入自定義的比較器實現(xiàn)2026-02-02

