一个字母引发的血案 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. 做事要有准备,现在开始准备下班放假~~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值