兼容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. bzoj 2058+2059+2060 Usaco2010 Nov
  2. android-文件存储的使用
  3. nginx1
  4. java 数据绑定的几种方式及相关注意事项-持续更新
  5. matlab微分方程dsolve使用
  6. 第二百三十二天 how can I 坚持
  7. gtest功能测试一
  8. 【转】Eclipse Java注释模板设置详解
  9. 玩转Slot Machine
  10. datatable的数据转置
  11. javascript生成自定义的arcgis simpletoolbar
  12. 【LeetCode】116. Populating Next Right Pointers in Each Node
  13. Matlab绘图基础——绘制三维表面
  14. 项目Beta冲刺Day7
  15. WPF 开源项目
  16. java 一些容易忽视的小点-控制语句
  17. RPM安装命令总结
  18. redis下载地址
  19. Js_Eval方法
  20. Android倒计时功能的实现

热门文章

  1. Flask-web开发
  2. EXCEL常用命令
  3. dotnet core 运行程序注意事项
  4. 常用软件URL
  5. python 学习分享-字典篇
  6. poj 2499第K短路模板
  7. 在Notepad++里配置python环境
  8. 96. Unique Binary Search Trees(I 和 II)
  9. How to resolve mysql problem when you get code 2003(10061) and 1130
  10. javascript之进阶