您的位置:首页 > 编程语言 > Java开发

一个字母引发的血案 java.io.File中mkdir()和mkdirs()_0

2017-01-25 11:27 537 查看

一个字母引发的血案

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

//省略部分代码...
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我们不知道这个是干嘛的,查了一下文档,获取 规范路径名字符串
获取父目录 递归调用

教训

写代码时要认真
基础知识要学的扎实
做事要有准备,现在开始准备下班放假~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: