一個字母引發的血案 java.io.File中mkdir()和mkdirs()


一個字母引發的血案

明天開始放年假了,臨放假前有個爬蟲的任務,其中需要把網絡圖片保存到本地,很簡單,馬上寫完了代碼:

    //省略部分代碼...
     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());
    }
  1. 判斷目錄是否存在,目錄存在返回 false
  2. 調用mkdir()創建目錄,創建成功返回 true
  3. getCanonicalFile我們不知道這個是干嘛的,查了一下文檔,獲取 規范路徑名字符串
  4. 獲取父目錄 遞歸調用

教訓

  1. 寫代碼時要認真
  2. 基礎知識要學的扎實
  3. 做事要有准備,現在開始准備下班放假~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM