一个字母引发的血案

明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码:

    //省略部分代码...
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. 做事要有准备,现在开始准备下班放假~~

一个字母引发的血案 java.io.File中mkdir()和mkdirs()的更多相关文章

  1. 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程

    在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...

  2. java.io.File中的pathSeparator与separator的差异

    先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指";&q ...

  3. java.io.File中的pathSeparator与separator的区别

    先总的说一下区别:File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:java   -cp   test.jar;abc.jar   HelloWorld就是指“;” Fi ...

  4. java.io.File中字段的使用

    File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:Java   -cp   test.jar;abc.jar   HelloWorld就是指“;” File.separa ...

  5. java.io.File中的 pathSeparator 与separator 的区别

    先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java   -cp   test.jar;abc.jar   HelloWorld 就是指“;” ...

  6. Java.io.File中的delete()方法和deleteOnExit()方法的区别

    1.delete()方法:             当调用delete()方法时,直接删除文件,不管该文件是否存在,一经调用立即执行: 2.deleteOnExit()方法:            当 ...

  7. File中mkdir()和mkdirs()的区别

    mkdir() 创建此抽象路径名指定的目录.只能在已经存在的目录中创建文件夹 如: File folder = new File("d:\\test1\\test2"); fold ...

  8. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  9. IO:File类(java.io.File)

    public class File extends Object implements Serializable, Comparable<File> 构造方法: public File(S ...

随机推荐

  1. RAD Studio 2010 环境设置(转)

    源:RAD Studio 2010 环境设置 最近在使用RAD Studio 2010做一些开发和实验,但在安装了自定义的控件及第三方下载的控件后,在我的工程里经常会提示找不到DCU,为了以后忘记这一 ...

  2. 如何创建一个要素数据类 IField,IFieldEdit,IFields,IFieldsEditI,GeometryDef,IGeometryDefEdit接口

    如何创建一个要素数据类 创建要素类用到了IFeatureWorkspace.CreateFeatureClass方法,在这个方法中有众多的参数,为了满足这些参数,我们要学习和了解下面的接口. IFie ...

  3. Linux下VNC配置多个桌面和修改密码 不会当系统重启vnc失效

    1:vncserver 2:iptables -I INPUT -p tcp --dport 5901 -j ACCEPT   客户端方式 3:iptables -I INPUT -p tcp --d ...

  4. openstack controller ha测试环境搭建记录(五)——配置rabbitmq集群

    配置rabbitmq集群的步骤非常简单,因为其本身含集群功能,参考openstack官网文档:http://docs.openstack.org/ha-guide/controller-ha-rabb ...

  5. iOS开发——获取手机当前WiFi名和MAC地址

    获取手机WiFi信息. iOS9以前的方法,还是能用,警告就警告吧!iOS9以后使用的是苹果最新的API框架,NetworkExtension/NEHotspotHelper.h,这个框架,第一次开放 ...

  6. Application_Start和Application_End事件执行时间

    Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Applicatio ...

  7. (中等) POJ 1191 棋盘分割,DP。

    Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...

  8. HUST 1354 Rubiks

    背包.注释写详细了. 本想这样写:每个组内各自做背包,然后组间做背包,但是由于这题M=10000,时间复杂度太大. #include<cstdio> #include<cstring ...

  9. MYSQL 主从服务器配置工作原理

    一.        主从配置的原理: Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instanc ...

  10. Python3基础 set() 删除一个列表中的重复项

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...