哥们儿几个,今天捣鼓代码的时候遇到个小坎,关于那个 createNewFile 的用法,琢磨了一阵子,记录一下过程,省得下次又忘了。
起因是这样的
我当时在写个小程序,需要把一些临时生成的数据存到本地一个文件里去。想着这不简单嘛直接用 createNewFile 就行了,指定好路径和文件名,比如想在 `D:\tempdata\logs\` 这个目录下创建一个叫 `*` 的文件。
动手试试
我就撸起袖子开始写了,大概就是创建了一个文件对象,指向 `D:\tempdata\logs\*`,然后直接调用了它的 createNewFile 方法。想着运行一下,文件就该出来了。
结果?程序跑完了,没报错,但是去 `D:\tempdata\logs\` 目录下一看,空的!啥也没有。这就怪了,我寻思这方法不是创建文件的吗?咋没动静。
琢磨琢磨
我试着直接在 `D:\` 根目录下创建 `*`,欸,这回成功了!文件确实生成了。这就让我纳闷了,难道是路径的问题?
我回过头去看那个失败的路径 `D:\tempdata\logs\*`,发现一个事儿:我电脑上压根就没 `tempdata` 这个文件夹,更别说它里面的 `logs` 文件夹了。难道 createNewFile 不会自动创建不存在的爹目录吗?
赶紧查了查(当然不是现在查,是当时),发现果然是这样!createNewFile 这哥们挺实在,它只负责创建那个最终的文件,前提是它爹、它爷爷那些文件夹必须已经存在了。如果路径中任何一级文件夹不存在,它就撂挑子不干了,而且会返回个 `false`,告诉你“我没成功”。
找到门路了
这时候我想起另外两个命令,好像叫 mkdir 和 mkdirs。印象里这俩是搞文件夹的。
简单来说:
- mkdir:这家伙是创建单层文件夹的。比如你想创建 `D:\tempdata`,如果 `D:\` 存在,它就能成功。但如果你想直接用它创建 `D:\tempdata\logs`,而 `D:\tempdata` 不存在,它也干不了。
- mkdirs:这个就比较猛了,它是创建多层文件夹。你想创建 `D:\tempdata\logs`,就算 `tempdata` 和 `logs` 都不存在,它会帮你一层一层地都创建只要你有权限,它就能给你整出来。
豁!原来是这样!
解决问题
那解决办法就清楚了。在我调用 createNewFile 之前,得先确保它爹目录(也就是 `D:\tempdata\logs`)是存在的。最稳妥的办法就是用 mkdirs。
正确的流程应该是:
1. 先获取文件路径中的目录部分,比如 `D:\tempdata\logs`。
2. 对这个目录路径调用 mkdirs 方法。这家伙会确保这条路上的所有文件夹都存在,如果已经存在了,它也不会报错,挺
3. 然后,再对完整的文件路径 `D:\tempdata\logs\*` 调用 createNewFile 方法。
这么一改,代码跑起来,文件果然乖乖地出现在了指定的位置!
总结一下
这几个哥们分工明确:
- createNewFile:专门负责一步,临门一脚创建文件,但前提是路必须铺好(文件夹必须存在)。
- mkdir:铺路,但一次只能铺一层(创建单级文件夹)。
- mkdirs:大力出奇迹,负责把整条路都铺好(创建多级文件夹),不管中间缺了多少层。
以后要创建文件,特别是路径比较深或者不确定父目录存不存在的时候,记得先用 mkdirs 开路,再用 createNewFile 放文件。这回实践算是把这个小坑给填上了,分享给大家,希望有点用。