在 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 }
沒有留言:
張貼留言