Google Code Prettify

2015年7月13日 星期一

NIO.2: Basic View

在 NIO 2 提供的六個檔案系統 metadata 的 view 中,第一個要了解的當然是 Basic View,顧名思義,這是所有檔案系統最基礎的部份,各檔案系統共通的部份。看一下下面的範例程式:
 1 package idv.steven.nio2.metadata;
 2 
 3 import java.io.IOException;
 4 import java.nio.file.FileVisitOption;
 5 import java.nio.file.Files;
 6 import java.nio.file.LinkOption;
 7 import java.nio.file.Path;
 8 import java.nio.file.Paths;
 9 import java.nio.file.attribute.BasicFileAttributes;
10 
11 public class BasicView {
12 
13     public static void main(String[] args) {
14         BasicFileAttributes attr = null;
15         //Path path = Paths.get("D:/DemoSite/NIO2/src/idv/steven/nio2/metadata", "BasicView.java");
16         Path path = Paths.get("D:/", "basic");
17         
18         try {
19             attr = Files.readAttributes(path, BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS);
20         } catch (IOException e) {
21             System.err.println(e);
22         }
23         
24         System.out.println("檔案大小: " + attr.size());
25         System.out.println("建立時間: " + attr.creationTime());
26         System.out.println("最後存取時間: " + attr.lastAccessTime());
27         System.out.println("最後修改時間: " + attr.lastModifiedTime());
28         System.out.println("是否為目錄? " + attr.isDirectory());
29         System.out.println("是否為一般檔案? " + attr.isRegularFile());
30         System.out.println("是否為連結? " + attr.isSymbolicLink());
31         System.out.println("是否為目錄、一般檔案、捷徑外的物件? " + attr.isOther());
32     }
33 }
這個程式會輸出檔案的 BasicView 的屬性,上面程式的第 15 行是指向一個實體檔案,第 16 行是指向一個「符號連結」(symbol link),輸出結果如下:
  • 實體檔案
檔案大小: 1267
建立時間: 2015-07-13T11:46:55.991394Z
最後存取時間: 2015-07-13T11:46:55.991394Z
最後修改時間: 2015-07-13T12:33:58.443979Z
是否為目錄? false
是否為一般檔案? true
是否為連結? false
是否為目錄、一般檔案、捷徑外的物件? false
  • 符號連結
檔案大小: 0
建立時間: 2015-07-13T12:30:41.166665Z
最後存取時間: 2015-07-13T12:30:41.166665Z
最後修改時間: 2015-07-13T12:30:41.166665Z
是否為目錄? false
是否為一般檔案? false
是否為連結? true
是否為目錄、一般檔案、捷徑外的物件? false
比較一下兩個輸出,可以了解兩者的差異,在 Windows 7 下測試,符號連結的檔案大小為 0,在 scientific linux 7.x 中則不為 0,不同的作業系統還是會有差異。在 unix / linux 中使用連結是非常平常的事,在 Windows 中很少見,該怎麼在 Windows 中建立連結呢? 指令如下,這樣可以在 D:/ 下建立一個命名為 basic 的符號連結,指向 BasicView.java。
D:\>mklink basic "D:/DemoSite/NIO2/src/idv/steven/nio2/metadata/BasicView.java"
上面的程式還有另外一種寫法,可以得到相同的結果,如下:
 1 package idv.steven.nio2.metadata;
 2 
 3 import java.io.IOException;
 4 import java.nio.file.FileVisitOption;
 5 import java.nio.file.Files;
 6 import java.nio.file.LinkOption;
 7 import java.nio.file.Path;
 8 import java.nio.file.Paths;
 9 import java.nio.file.attribute.BasicFileAttributes;
10 
11 public class BasicView2 {
12 
13     public static void main(String[] args) throws IOException {
14         BasicFileAttributes attr = null;
15         //Path path = Paths.get("D:/DemoSite/NIO2/src/idv/steven/nio2/metadata", "BasicView.java");
16         Path path = Paths.get("D:/", "basic");
17         
18         System.out.println("檔案大小: " + (Long)Files.getAttribute(path, "basic:size", LinkOption.NOFOLLOW_LINKS));
19         System.out.println("建立時間: " + Files.getAttribute(path, "basic:creationTime", LinkOption.NOFOLLOW_LINKS));
20         System.out.println("最後存取時間: " + Files.getAttribute(path, "basic:lastAccessTime", LinkOption.NOFOLLOW_LINKS));
21         System.out.println("最後修改時間: " + Files.getAttribute(path, "basic:lastModifiedTime", LinkOption.NOFOLLOW_LINKS));
22         System.out.println("是否為目錄? " + Files.getAttribute(path, "basic:isDirectory", LinkOption.NOFOLLOW_LINKS));
23         System.out.println("是否為一般檔案? " + Files.getAttribute(path, "basic:isRegularFile", LinkOption.NOFOLLOW_LINKS));
24         System.out.println("是否為連結? " + Files.getAttribute(path, "basic:isSymbolicLink", LinkOption.NOFOLLOW_LINKS));
25         System.out.println("是否為目錄、一般檔案、捷徑外的物件? " + Files.getAttribute(path, "basic:isOther", LinkOption.NOFOLLOW_LINKS));
26     }
27 }




沒有留言:

張貼留言