Java中mkdir()与mkdirs()这两种方法的区别到底在哪里???

Java中mkdir()与mkdirs()这两种方法的区别到底在哪里???


       昨天一个不留神居然把自己那篇辛辛苦苦写好的《Java中mkdir()和mkdir()这两个方法的区别到底是在哪里???》这篇博客给删了,所以昨天到现在一直很懊恼,于是拥有严重强迫症今天一定要把它写完!好!那就开始今天的正题!

       首先看到这两个方法,我相信大家一定不会陌生的!先看下这两个方法的含义具体代表的含义是什么?百度了一下如下所示:

java.io.File.mkdir():只能创建一级目录,且父目录必须存在,否则无法成功创建一个目录。

java.io.File.mkdirs():可以创建多级目录,父目录不一定存在。


       单单看了这两个方法的含义,好像已经明白的样子,但其实你只是知道一个表象而已,并没有真正深入了解~   今天我就以我在公司遇到的一个bug为例,我将会重现bug的全部过程和我最后的解决方案,大家尽情看就可以了~
       前几天公司商户管理部一个运营人员在操作公司的一个老系统时突然在钉钉上向我发了一个截图,我一看,原来是旧系统有个界面在上传申请激活表的时候报错了,如下图所示:
Java中mkdir()与mkdirs()这两种方法的区别到底在哪里???_第1张图片
从上图不难分析,系统报了非法参数的错误,但还是要去分析代码,相关代码如下图所示:

String activatefilepath = null;
	String filePath = null;
	String sid = request.getParameter("sid");
	
	if(null!=sid && !"".equals(sid)){
		filePath=sid;
	}else{
		out.print("获取文件上传路径[sid]出错!");
		return;
	}
	
	//检查目录是否存在
	String root= request.getSession().getServletContext().getRealPath("/");
	root = FileUtil.replaceTag(root,"\\","/");
	if(!"/".equals(root.substring(root.length()-1)))
		root+="/";
	System.out.println("上传目录根路径:"+root);
	
	String fullPath=root+"upload/activatefile/"+filePath ;
	java.io.File f=new java.io.File(fullPath);
	if(!f.exists()){
		f.mkdir();
	}
	System.out.println("上传目录全路径:"+fullPath);
	//临时保存目录
	String fullPath2 = fullPath+"/temp/";
	java.io.File f2=new java.io.File(fullPath2);
	if(!f2.exists()){
		f2.mkdir();
	}
	System.out.println("上传目录临时全路径:"+fullPath2);
	// 将上传文件全部保存到指定目录

在本地中调试代码时正确的输出结果为:
上传目录根路径:/home/jboss/jboss-5.1.0.GA/server/default/deploy/epayadmin.war/
上传目录全路径:/home/jboss/jboss-5.1.0.GA/server/default/deploy/epayadmin.war/upload/activatefile/BPOSZLH006/
上传目录临时全路径:/home/jboss/jboss-5.1.0.GA/server/default/deploy/epayadmin.war/upload/activatefile/BPOSZLH006/temp/

既然本地都可以了,为什么生产会无端端报错呢???我就纳闷了,当时一看到“This path does not exist”时,我就明白打印出来的这个三个路径肯定有个文件夹是不存在的!于是我就将每个路径发给了运维人员进行核查,居然发现还真是少了一个名为“activatefile”的文件夹,所以就导致了代码执行到f.exists()时就报错了(如下图所示),因为fullpath压根就是一个无效路径,所以java.io.File这个对象f也是null,null也敢直接调用exists()这个方法???我就呵呵了。。。。
Java中mkdir()与mkdirs()这两种方法的区别到底在哪里???_第2张图片
Java中mkdir()与mkdirs()这两种方法的区别到底在哪里???_第3张图片
但是话说回来,怎么解决呢???其实很简单,既然少了个activatefile这个文件夹,那么就直接在/home/jboss/jboss-5.1.0.GA/server/default/deploy/epayadmin.war/upload/这个路径下创建一个activatefile文件夹,因为/home/jboss/jboss-5.1.0.GA/server/default/deploy/epayadmin.war/upload/activatefile/这个父目录原本是不存在的,所以当运维人员手动在服务器上创建了activatefile文件夹之后,BPOSZLH006这个文件夹可以直接交由mkdir()这个方法创建了,同样的道理,temp文件夹也可以交由mkdir()方法自行创建(如上图所示)。
其实可以直接将mkdir()方法改成mkdirs()方法也是可以的,因为mkdirs()这个方法不必理会父目录的存在,可以创建多级父录,但是在父目录都相同,只是区别在子目录的名称时,使用它就会导致系统的开销比较大,所以使用mkdir()是明智的选择!于是当时我压根不用改代码,直接叫运维人员在服务器上mkdir(新建)一个名为“activatefile”的文件夹就轻轻松松搞定了!


       相信大家听我这么一说,应该都对java中mkdir()与mkdirs()这两种方法有了更进一步的了解。其实学任何东西都一样,你不但要掌握这个东西是什么,更重要的是你要知道如何将你学到的东西使用到实际场景中!以此共勉!

你可能感兴趣的:(日常bug解决)