zoukankan      html  css  js  c++  java
  • 一个字母引发的血案 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:dataPic213249002415585464.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. 做事要有准备,现在开始准备下班放假~~
  • 相关阅读:
    20190318-使用类做一个简单的图书馆管理系统
    20190313-面向对象的简单理解
    20190313-时间和日期-Time
    20190305-leetcode题目有效的括号
    20190227-做一个简易代码统计工具
    20190226-利用序列化完成小型记账程序
    20190221-文件操作
    20190131-文件操作命题练习
    Excel技巧—如何从重复行中取某一行
    Excel技巧—轻松搞定多级联动下拉列表
  • 原文地址:https://www.cnblogs.com/javanoob/p/file_mkdirs.html
Copyright © 2011-2022 走看看