一个字母引发的血案 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());
}
- 判断目录是否存在,目录存在返回 false
- 调用mkdir()创建目录,创建成功返回 true
- getCanonicalFile我们不知道这个是干嘛的,查了一下文档,获取 规范路径名字符串
- 获取父目录 递归调用
教训
- 写代码时要认真
- 基础知识要学的扎实
- 做事要有准备,现在开始准备下班放假~~
一个字母引发的血案 java.io.File中mkdir()和mkdirs()的更多相关文章
- 一个链接引发的血案---------服务器 IO及网络流量暴涨解决历程
在这里介绍一次因为更改网站地址而引发服务器IO读取速度,网络流入流出速度暴涨10倍的解决经历. 环境:Ubuntu + Nginx + php-cgi + Wordpress 事情是这样的,现在网站使 ...
- java.io.File中的pathSeparator与separator的差异
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指";&q ...
- java.io.File中的pathSeparator与separator的区别
先总的说一下区别:File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:java -cp test.jar;abc.jar HelloWorld就是指“;” Fi ...
- java.io.File中字段的使用
File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如:Java -cp test.jar;abc.jar HelloWorld就是指“;” File.separa ...
- java.io.File中的 pathSeparator 与separator 的区别
先总的说一下区别: File.pathSeparator指的是分隔连续多个路径字符串的分隔符,例如: java -cp test.jar;abc.jar HelloWorld 就是指“;” ...
- Java.io.File中的delete()方法和deleteOnExit()方法的区别
1.delete()方法: 当调用delete()方法时,直接删除文件,不管该文件是否存在,一经调用立即执行: 2.deleteOnExit()方法: 当 ...
- File中mkdir()和mkdirs()的区别
mkdir() 创建此抽象路径名指定的目录.只能在已经存在的目录中创建文件夹 如: File folder = new File("d:\\test1\\test2"); fold ...
- 33.JAVA编程思想——JAVA IO File类
33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...
- IO:File类(java.io.File)
public class File extends Object implements Serializable, Comparable<File> 构造方法: public File(S ...
随机推荐
- android usb挂载分析---vold处理内核消息
android usb挂载分析---vold处理内核消息 分类: u盘挂载2012-03-29 22:25 3215人阅读 评论(0) 收藏 举报 androidactioniteratordiskd ...
- 在XAMPP上建立多个域名的站点
XAMPP默认安装完毕后,站点文件默认放在/xampp/htdocs/ 文件下,并且可以通过http://localhost 进行访问.先前在测试各种程序的时候均是在/xampp/htdocs/ 文件 ...
- iOS之Nib和Xib以及storyboard(故事版)
本文转发至:http://blog.csdn.net/tonny_guan/article/details/8542789 nib.xib与故事板 如果大家使用过苹果的官方资料,一定会发现某些资料上会 ...
- 设计 无状态的类,而不是 stateful
0down votefavorite I have created a Database Abstraction Layer over PDO to refrain from creating m ...
- Openlayers修改矢量要素
将以下代码放到demo下examples中即可运行 <!DOCTYPE html><html> <head> <meta http-equiv="C ...
- AppServ设置虚拟主机 及域名连接
1: 安装好AppServ2.5.9软件,官网是:http://www.appservnetwork.com/ ,2.59下载地址是:http://nchc.dl.sourceforge.net/so ...
- mustache.js基本使用(一)
作者:zccst 模板已是第二次接触,第一次使用模板记得是在十分系统里渲染页面时使用,当时已做到熟练使用,但实际上仍不知道原因. 再次学习模板已不是从0开始,所以还算顺手,但毕竟还只限于使用,今天继续 ...
- 从内存中加载DLL Delphi版(转)
源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...
- Java对文件的16进制读取和操作
大家可以参考一下源代码的相关部分注释,然后写出自己的16进制处理程序.有几个重点地方: 16进制字符串->10进制数 int input = Integer.parseInt("Str ...
- java 自动备份MySQL 数据库(转载)
1 package com.learn4j.bat; public class Backup { private String user_name;// 数据库用户名 private String u ...