兼容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
