<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    afrag  
    記錄學習和成長的歷程
    日歷
    <2010年3月>
    28123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910
    統計
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10138
    • 排名 - 2383

    最新評論

    閱讀排行榜

    評論排行榜

     
    轉自開發者的天空
    在上面的一篇文章中,我們已經說過了Path類的操作主要有兩種:對路徑的操作和對文件的操 作。這篇文章中我們就來了解一下對路徑的操作。
    創建Path實例
    Path實例包含了指定文件或目錄位置的信息,在實例化Path類時,需要指定一個或多個目錄或文件名。路徑的根目錄不是必須的;路徑信息可能僅僅是一個 目錄或文件的名稱。
    最簡單的創建Path實例的方式就是使用Paths(注意這里有一個s)類的get方法:
    Path p1 = Paths.get("/tmp/foo");
    Path p2 
    = Paths.get(args[0]);
    Path p3 
    = Paths.get("file:///Users/joe/FileTest.java");

    Path類接受String或URI作為參數。

    獲取路徑信息
    前面我們已經說過了,File System一般是樹形結構,因此我們可以把Path理解為按順序存儲的一系列的名稱(目錄名稱和文件名稱)。目錄結構中最高一層的目錄名就是序列中 index為0的那一個,目錄結構中最低一層的目錄名或者文件名就是序列中index為n-1的那一個(這里n是路徑中層次的數目)。Path類提供方法 來通過index獲取序列中的一個元素或一個子序列。
    隨后的例子中我們使用的目錄結構如下圖:
    io-dirStructure.JPG

        下面的代碼定義了一個Path對象并獲取其中的信息。要注意的是這些代碼中除了isHidden方法外,其他的方法并不需要指定的目錄或文件存在;如果不 存在,isHidden方法會拋出異常。
    Path path = Paths.get("C:\\home\\joe\\foo");    // Microsoft Windows syntax
    //Path path = Paths.get("/home/joe/foo");    // Solaris syntax
    System.out.format("toString: %s%n", path.toString());
    System.out.format(
    "getName: %s%n", path.getName());
    System.out.format(
    "getName(0): %s%n", path.getName(0));
    System.out.format(
    "getNameCount: %d%n", path.getNameCount());
    System.out.format(
    "subpath(0,2): %d%n", path.subpath(0,2));
    System.out.format(
    "getParent: %s%n", path.getParent());
    System.out.format(
    "getRoot: %s%n", path.getRoot());
    System.out.format(
    "isHidden: %s%n", path.isHidden());

    下面是這段代碼的輸出情況
    方法 Solaris下的輸出 Windows下的 輸出 備注
    toString /home/joe/foo C:\home\joe\foo
    getName foo foo 獲 取名稱序列中的最后一個,也就是最底層的目錄或文件名
    getName(0) home home 獲 取名稱序列中的第一個,也就是最靠近根目錄的那一層。注意根目錄不在名稱序列中
    getNameCount 3 3 獲 取名稱序列的元素個數
    subpath(0,2) home/joe home\joe 獲 取從指定的開始點到指定的結束點的子路徑。注意這里包括開始點,但不包括結束點。
    getParent /home/joe \home\joe 返 回Path指定的目錄或文件的父目錄
    getRoot / C:\ 返 回根目錄
    isHidden false false 如果文件是 隱藏文件,或者目錄是隱藏目錄,返回true。因為要訪問文件的屬性,所以如果Path指定的目錄或者文件不存在,會拋出異常。


    上面的代碼中我們創建Path時使用的是絕對路徑,下面我們來看看創建路徑時使用相對路徑時,這段代碼的執行結果
            //Path path = Paths.get("sally/bar");     // Solaris syntax
            Path path = Paths.get("sally\\bar");    // Microsoft Windows syntax

    大 家可以自行去實驗一下具體的輸出是什么。

    去除Path中的冗余
    在很多文件系統中我們使用'.'來代表當前目錄,使用'..'代表父目錄。在有些情況下我們創建的路徑中會有冗余的路徑信息,例如:
            /home/./joe/foo
            /home/sally/../joe/foo
    方法normalize會去除這些冗余信息,包括'.'或'directory/..'。上面的兩個例子在去除冗余信息后都是/home/joe /foo。
    要注意的是normalize方法并不去檢查文件系統,它只是簡單的進行語法操作。在第二個例子中,如果sally是一個指向其他的目錄的符號鏈接,那么 去除了sally/..后可能導致Path不在指向原來的文件或目錄。
    如果你需要清除冗余信息,又要保證結果仍然指向正確的文件或目錄,可以使用toRealPath方法。在下面我們會講到這個方法。
    轉換Path
    有3個方法用來轉換Path。
    • toUri方法
      如果你需要將Path轉換為可以在瀏覽器中打開的字符串格式,可以使用toUri方法,例如:
            Path p1 = Paths.get("/home/logfile");
            System.out.format(
    "%s%n", p1.toUri());  // 結果是 file:///home/logfile
    注意在這里即使/home/logfile'指向的目錄或文件不存在,這段代碼同樣能夠執行成功。
    • toAbsolutePath 方法
      該方法將路徑轉換為絕對路徑。如果原來的Path已經是絕對路徑,該方法直接返回原有的Path對象。
      我們來看看下面的例子:
                      Path path = Paths.get("home\\joe\\foo");
                      Path absolutePath 
      = path.toAbsolutePath();
                      System.out.println(path 
      == absolutePath); //結果是false
                      
                      Path path2 
      = Paths.get("c:\\home\\joe\\foo ");
                      Path absolutePath2 
      = path2.toAbsolutePath();
                      System.out.println(path2 
      == absolutePath2);//結果是true
    同樣的,toAbsolutePath方法并不需要 Path所指向的文件或目錄存在。
    • toRealPath方法
      這個方法會返回一個已經存在的文件或目錄的真實路徑(如果文件或目錄不存在或無法訪問,該方法會拋出異常)。該方法會執行以下的操作:
      如果傳入的參數是true并且文件系統支持符號鏈接,則解析路徑中存在的符號鏈接(如果有的話)。
      如果原來的Path是相對路徑,將其轉換成絕對路徑。
      如果路徑中含有冗余信息,返回的Path中這些冗余信息會被去除。

    連接兩個Path
    可以使用resolve方法來將兩個Path連接起來。該方法的參數是一個字符串。如果該字符串代表的是一個相對路徑,那么這個路徑會被擴展到原來的路徑 后。如果傳入的字符串是一個絕對路徑,那么返回的值就是傳入的這個絕對路徑。例如:
            Path p1 = Paths.get("C:\\home\\joe\\foo");    
            System.out.format(
    "%s%n", p1.resolve("bar")); // 結果是 C:\home\joe\foo\bar

            Paths.get(
    "foo").resolve("c:\\home\joe");       // 結果是  C:\home\joe


    創建兩個路徑之間的路徑
    這個功能說起來有些繞口,實際的功能就是創建兩個指定的目錄或文件之間的相對路徑。例如:
            Path p1 = Paths.get("joe/foo");
            Path p2 
    = Paths.get("sally");
    在這個例子中,由于兩個路徑都是相對路徑,沒有其他的 信息,我們會認為這兩個joe和sally是同一級的兄弟目錄,因此有以下的結果

            Path p1_to_p2 = p1.relativize(p2);   // 結果是 ../../sally
            Path p2_to_p1 = p2.relativize(p1);   // 結果是 ../joe/foo
    讓我們看看另外一個例子
            Path p1 = Paths.get("home");
            Path p3 
    = Paths.get("home/sally/bar");
            Path p1_to_p3 
    = p1.relativize(p3);  // 結果是 sally/bar
            Path p3_to_p1 = p3.relativize(p1);  // 結果是 ../..
    在這個例子中,兩個路徑共享同一個節點-home, 所以結果并不是../home/sally/bar和../../../home.
    如果兩個路徑中有一個是絕對路徑,另外一個是相對路徑,relative方法會拋出異常。如果兩個路徑都是絕對路徑,那么relative方法的行為和系 統相關,不同的系統可能不同。
    我在Windows操作系統下實驗了一下,如果兩個路徑屬于同一個硬盤,那么可以執行成功,否則會拋出異常。
    Path path1 = Paths.get("c:\\abcd\\efg");
    Path path2 
    = Paths.get("c:\\temp");
    System.out.println(path1.relativize(path2));        
    //結果是..\..\temp
    System.out.println(path2.relativize(path1));        //結果是..\abcd\efg

    Path path3 
    = Paths.get("c:\\abcd\\efg");
    Path path4 
    = Paths.get("d:\\temp");
    System.out.println(path3.relativize(path4));        
    //拋出異常


    Path 的比較
    Path提供equals方法來檢查兩個Path是否相等。但是這里 要注意的是比較的并不是兩個Path是否指向同一個目錄或者文件。請看下面的例子:
    Path path1 = Paths.get("abcd\\123");
    Path path2 
    = Paths.get("abcd\\123");
    Path path3 
    = Paths.get("abcd\\.\\123");
    System.out.println(path1.equals(path2));        
    //true
    System.out.println(path1.equals(path3));        //false
    System.out.println(path1.equals(path3.normalize())); //true
    System.out.println(path1.equals(path1.toAbsolutePath()));        //false

    Path 類還提供了startsWith和endsWith方法,這兩個方法用來檢查路徑是否以指定的字符串開始或者結束,例如:
            Path path = ;
            Path otherPath 
    = ;
            Path beginning 
    = Paths.get("/home");
            Path ending 
    = Paths.get("foo");

            
    if (path.equals(otherPath)) {
                
    //equality logic here
            } else if (path.startsWith(beginning)) {
                
    //path begins with "/home"
            } else if (path.endsWith(ending)) {
                
    //path ends with "foo"
            }

    Path類實現了Iterable接口,iterator方法會返回一個Iterator對象,該對象中的第一個元素就是原 路徑中最上層(最靠近根節點)的目錄。下面是使用這個方法的例子:
            Path path = ;
            
    for (Path name: path) {
                System.out.println(name);
            }

    Path類還實現了Comparable接口,因此可以使用compareTo來比較兩個Path。比較的算法和結果是和文 件系統的提供者和系統平臺相關的。大家在使用之前,最后先實驗一下。
    Path類還提供了一個方法isSameFile來檢查兩個Path是否指向同一個目錄或文件。如果作為參數的Path為null,那么會直接返回 false,不會去檢查Path指向的文件是否存在。如果兩Path來自不同的文件系統提供者,那么也會直接返回false,不會去檢查文件或目錄是否存 在。如果兩個Path執行equals方法的返回結果為true,那么這個方法直接返回true,也不會去檢查文件或目錄是否存在。其他的情況下是否會去 打開或訪問Path指向的文件或目錄是與具體的實現相關的,也就是說不同的JDK/JRE可能會有不同的行為。
    驗證文件或目錄是否存在
    上面所介紹的很多方法都不會去驗證Path指向的文件或目錄是否存在,只是操作Path實例自身。但是在有些情況下,你 需要訪問文件系統來驗證文件、目錄存在與否,這時你可以使用exists和notExists方法。需要注意的是!path.exists()并不等于 path.notExists()。當你調用這兩個方法時,有以下3中情況:
    • 文件或者目錄被證實存在
    • 文件或者目錄被證實不存在
    • 不知道文件或目錄是否存在。當程序沒有訪問這個文 件或目錄的權限的時候這個情況會發生。

    如果exists()和notExists()都返回false,說明無法驗證該文件是否存在。

    在下面一篇文章中,我們會介紹怎樣進行文件的操作。
    posted on 2010-03-27 22:45 afrag 閱讀(301) 評論(0)  編輯  收藏 所屬分類: Java 技術
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 在线观看免费中文视频| 亚洲免费在线观看视频| 无码欧精品亚洲日韩一区| 亚洲成a人片毛片在线| 人成电影网在线观看免费| 中文字幕亚洲免费无线观看日本 | 亚洲一区二区三区四区在线观看| 亚洲AV色吊丝无码| 免费人妻精品一区二区三区| 在免费jizzjizz在线播| 亚洲宅男天堂在线观看无病毒| 亚洲国产精品成人综合色在线婷婷| 免费无码又爽又黄又刺激网站| 国产91色综合久久免费| 亚洲综合AV在线在线播放| 丰满亚洲大尺度无码无码专线| 久久久99精品免费观看| 免费一级e一片在线播放| 亚洲成人激情小说| 国产91免费在线观看| 亚洲Aⅴ无码专区在线观看q| 特级毛片爽www免费版| 国产男女猛烈无遮挡免费视频网站| 亚洲免费一级视频| 美女视频黄a视频全免费| 亚洲国产精品成人综合久久久| 国产精品免费福利久久| 亚洲AV区无码字幕中文色| 男人进去女人爽免费视频国产| 亚洲AV第一页国产精品| 久久免费精彩视频| 亚洲精品视频在线观看视频| 久久久久久国产精品免费无码| 亚洲色图综合网站| 国产精品美女午夜爽爽爽免费| 国产精品亚洲一区二区麻豆| 日韩黄色免费观看| 中国一级毛片视频免费看| 亚洲成人在线网站| 18禁成年无码免费网站无遮挡| 亚洲精华国产精华精华液好用 |