Java文件夾操作,判斷多級路徑是否存在,不存在就創建(包括windows和linux下的路徑字符分析),兼容Windows和Linux


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM