一個字母引發的血案
明天開始放年假了,臨放假前有個爬蟲的任務,其中需要把網絡圖片保存到本地,很簡單,馬上寫完了代碼:
//省略部分代碼...
Long fileId= (Long) data.get("FilmId");
File filmpath= new File(path+fileId);
if (!filmpath.exists())
filmpath.mkdir();
//省略部分代碼...
OutputStream os = new FileOutputStream(path+fileId+"\\"+id+".jpg");
跑起來發現突然爆出如下錯誤:
java.io.FileNotFoundException: E:\data\Pic\21324900\2415585464.jpg (系統找不到指定的路徑。)
看到這個錯誤馬上打開本地文件夾,看一眼路徑是否存在,一看不存在,馬上開始打斷點排查問題,結果發現把filmpath.mkdirs() 寫成了filmpath.mkdir()
一直用mkdirs()缺忽略了還有一個mkdir(),這兩個到底有什么區別呢?
mkdirs() 與 mkdir() 不同
官方文檔給的解釋是:
boolean mkdir() 創建此抽象路徑名指定的目錄。
boolean mkdirs() 創建此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。
我通過Demo通俗的解釋一下:
String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdir();
System.out.println(result);
當c的父目錄存在時 返回true
當c的父目錄不存在時 返回false
String path ="E:\\data\\a\\b\\c";
Boolean result = new File(path).mkdirs();
System.out.println(result);
System.in.read();
當c父的目錄不存在時,mkdirs會創建父目錄 返回true
mkdirs 源碼
public boolean mkdirs() {
if (exists()) {
return false;
}
if (mkdir()) {
return true;
}
File canonFile = null;
try {
canonFile = getCanonicalFile();
} catch (IOException e) {
return false;
}
File parent = canonFile.getParentFile();
return (parent != null && (parent.mkdirs() || parent.exists()) &&
canonFile.mkdir());
}
- 判斷目錄是否存在,目錄存在返回 false
- 調用mkdir()創建目錄,創建成功返回 true
- getCanonicalFile我們不知道這個是干嘛的,查了一下文檔,獲取 規范路徑名字符串
- 獲取父目錄 遞歸調用
教訓
- 寫代碼時要認真
- 基礎知識要學的扎實
- 做事要有准備,現在開始准備下班放假~~