在 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 }