设为首页 收藏本站
查看: 2225|回复: 0

[经验分享] Java文件夹操作,判断多级路径是否存在,不存在就创建(包括windows和linux下的路径字符分析),兼容Windows和Linux

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2017-6-29 23:13:08 | 显示全部楼层 |阅读模式
  兼容windows和linux。
  分析:
  在windows下路径有以下表示方式:
  (标准)D:\test\1.txt
  (不标准,参考linux)D:/test/1.txt
  然后在java中,尤其使用File对象在操作windows的路径时,非常的不好操作,因为不知道要用多少个斜杠“\”来表示。
  斜杠“\”为转义字符(参考:http://www.cnblogs.com/EasonJim/p/6561576.html)。
  而java的File对象上无论是windows还是linux,输入的路径不管标不标准,输出的路径都是当前系统的标准路径;但是,很奇怪的是用普通print打印的路径上,尤其是windows标准路径,和上面展示的一模一样;但反过来用打印出来的路径用在new File("D:\test\1.txt")却会提示反义字符报错。
  经过研究,如果像windows下,这个方法在构造上只能识别类似这样的路径:D:\\test\\1.txt,而这个路径只是打印出来看到的,如果再把这个套入File对象进行构造时,也会报转义字符错误;要解决这个问题也就是说,File对象最终会识别双斜杠的路径,但是是转义后的双斜杠路径才能识别,最终要写成:D:\\\\test\\\\1.txt这样才是正确的。
  以上分析windows的路径上对于以后路径的操作比较有帮助,比如切割路径的字符串时,这个路径在存入的变量时,是包含转义字符的,也就是要以“\\\\”四个斜杠为主才对。
  还有一点需要注意的,由于上面列举的两个路径,在不标准的路径下近些切割找基点时,可以先用File对象取构造,然后获取绝对路径传入,这样输出的就是标准的路径,变量上也包含的正确的转义字符。
  那么类似这样的路径问题,在linux下就不会出现,比如linux表示方式只有以下这种形式:
  /users/jim/test/1.txt
  可以看出,linux采用的反斜杠“/”,在字符上不是转义字符,所以File对象在输入和输出上都是原样输出。
  使用技巧:很多时候我们一般是结合标准和非标准的路径结合一起,在通过File对象进行构造输出标准的路径,比如:D:\\\\test/abc
  具体操作:
  参考:http://zyjustin9.iteye.com/blog/2164934
  代码如下:



  /**
* 判断多级路径是否存在,不存在就创建
*  
* @param filePath 支持带文件名的Path:如:D:\news\2014\12\abc.text,和不带文件名的Path:如:D:\news\2014\12
*/
public static void isExistDir(String filePath) {
String paths[] = {""};
//切割路径
try {
String tempPath = new File(filePath).getCanonicalPath();//File对象转换为标准路径并进行切割,有两种windows和linux
paths = tempPath.split("\\\\");//windows            
if(paths.length==1){paths = tempPath.split("/");}//linux
} catch (IOException e) {
System.out.println("切割路径错误");
e.printStackTrace();
}
//判断是否有后缀
boolean hasType = false;
if(paths.length>0){
String tempPath = paths[paths.length-1];
if(tempPath.length()>0){
if(tempPath.indexOf(".")>0){
hasType=true;
}
}
}        
//创建文件夹
String dir = paths[0];
for (int i = 0; i < paths.length - (hasType?2:1); i++) {// 注意此处循环的长度,有后缀的就是文件路径,没有则文件夹路径
try {
dir = dir + "/" + paths[i + 1];//采用linux下的标准写法进行拼接,由于windows可以识别这样的路径,所以这里采用警容的写法
File dirFile = new File(dir);
if (!dirFile.exists()) {
dirFile.mkdir();
System.out.println("成功创建目录:" + dirFile.getCanonicalFile());
}
} catch (Exception e) {
System.err.println("文件夹创建发生异常");
e.printStackTrace();
}
}
}   
  测试工程:https://github.com/easonjim/5_java_example/tree/master/dirtest

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389463-1-1.html 上篇帖子: 基于windows server 2012 的微软桌面虚拟化实战教程 下篇帖子: windows下安装redis和php的redis扩展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表