国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Java7中NIO.2的使用——第二節(jié)元數(shù)據(jù)文件的屬性

2019-11-14 15:33:52
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  如果你有很多疑問關(guān)于一個(gè)文件或目錄,它是否是隱藏的,它的大小是多少,誰(shuí)擁有它,你可以從元數(shù)據(jù)中得到這些信息。所謂的元數(shù)據(jù),就是描述數(shù)據(jù)的數(shù)據(jù)。

  NIO.2組織了這些原數(shù)據(jù)的屬性的概念,并提供了java.nio.file.attribute 包去訪問它們。因?yàn)椴煌奈募到y(tǒng)有不同的概念跟蹤這些屬性,所以,NIO.2根據(jù)特定的文件系統(tǒng)進(jìn)行映射然后對(duì)應(yīng)到不同的view中。通常情況下,view會(huì)提供一些通用的方法,例如readAttributes()。除此而外,你可以通過(guò)getAttribute()setAttribute() 方法來(lái)提取或設(shè)置單一的屬性,這些方法在 java.nio.file.Files 類中都是可用的。依據(jù)view,其他的方法可以完成額外的任務(wù)。

  在NIO.2 中支持六種view,下面就是這些view的概述。

  • BasicFileAttributeView:這是最基本的屬性并且被所有的文件系統(tǒng)所支持。這個(gè)屬性視圖的名字叫做basic。
  • DosFileAttributeView:Windows操作系統(tǒng)中的文件系統(tǒng)一般使用遺留的“DOS”文件屬性視圖,該視圖包含的屬性有是否為只讀文件(readonly)、是否為隱藏文件(hidden)、是否為系統(tǒng)文件(system)和是否為歸檔文件(archive)等。DosFileAttributeView接口中包含了設(shè)置這些屬性的方法。
  • PosixFileAttributeView:這個(gè)視圖是基本屬性視圖的擴(kuò)展,用來(lái)支持可移植操作系統(tǒng)的Unix。
  • FileOwnerAttributeView:這個(gè)視圖支持包含文件所有者之一概念的文件系統(tǒng)的實(shí)現(xiàn)。
  • AclFileAttributeView:這個(gè)視圖支持讀取和更新文件的ACL(access control list)操作。
  • UserDefinedFileAttributeView:這個(gè)視圖支持用戶自定義的元數(shù)據(jù)。

  --------------------------------------------------------------------------------------------------------------------------------

  確定視圖支持一個(gè)特定的文件系統(tǒng)

  在你嘗試訪問view的屬性時(shí),請(qǐng)確認(rèn)你的文件系統(tǒng)是否支持對(duì)應(yīng)的view。NIO.2可以讓你根據(jù)名字或是檢查文件的存儲(chǔ)(FileStore類描述了任何存儲(chǔ)類型的映射,例如分區(qū),設(shè)備,卷,等等)來(lái)列出所有支持的視圖列表。

  一旦獲取了默認(rèn)系統(tǒng)的訪問權(quán)限,通過(guò)調(diào)用 FileSystems.getDefault()方法,你就會(huì)很容易的遍歷所有的支持的view通過(guò)調(diào)用 FileSystem.supportedFileAttributeViews()方法。請(qǐng)看下面的代碼。

import java.nio.file.FileSystem;import java.nio.file.FileSystems;import java.util.Set;&hellip;FileSystem fs = FileSystems.getDefault();        Set<String> views = fs.supportedFileAttributeViews();         for (String view : views) {      System.out.PRintln(view);}

  在Windows7下執(zhí)行的結(jié)果:

  owner
  dos
  acl
  basic
  user

   你可以通過(guò)調(diào)用FileStore.supportsFileAttributeView() 方法來(lái)測(cè)試特定的文件存儲(chǔ)上的view,你可以傳遞view描述的字符串,或是直接傳遞view的接口名字。下面演示在支持的文件存儲(chǔ)上檢查是否支持basic視圖的代碼。

import java.nio.file.FileStore;import java.nio.file.FileSystem;import java.nio.file.FileSystems;import java.nio.file.attribute.BasicFileAttributeView;…FileSystem fs = FileSystems.getDefault();for (FileStore store : fs.getFileStores()) {   boolean supported = store.supportsFileAttributeView(BasicFileAttributeView.class);    System.out.println(store.name() + " ---" + supported);}

  當(dāng)然,你也可以測(cè)試一個(gè)特定的文件支持的view。

import java.io.IOException; import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     FileStore store = Files.getFileStore(path);     boolean supported = store.supportsFileAttributeView("basic");     System.out.println(store.name() + " ---" + supported); } catch (IOException e) {     System.err.println(e); }

  --------------------------------------------------------------------------------------------------------------------------------

  Basic 視圖

  大部分文件系統(tǒng)的實(shí)現(xiàn)支持一些通用的屬性,例如大小,創(chuàng)建時(shí)間,上次訪問時(shí)間,最后修改時(shí)間等等。這些屬性被分組放在BasicFileAttributeView中,可以提取或設(shè)置下面描述的部分中。

  使用readAttributes()方法獲得成批的屬性

  你可以通過(guò)使用readAttributes()方法獲取成批的屬性,這個(gè)方法的參數(shù)支持 LinkOption.NOFOLLOW_LINKS 枚舉類型,意思是不包含符號(hào)鏈接的文件。

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; … BasicFileAttributes attr = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     attr = Files.readAttributes(path, BasicFileAttributes.class); } catch (IOException e) {     System.err.println(e); } System.out.println("File size: " + attr.size()); System.out.println("File creation time: " + attr.creationTime()); System.out.println("File was last accessed at: " + attr.lastAccessTime()); System.out.println("File was last modified at: " + attr.lastModifiedTime()); System.out.println("Is directory? " + attr.isDirectory()); System.out.println("Is regular file? " + attr.isRegularFile()); System.out.println("Is symbolic link? " + attr.isSymbolicLink()); System.out.println("Is other? " + attr.isOther());

  通過(guò)getAttribute()方法獲得單一屬性。

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     long size = (Long)Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS);                         System.out.println("Size: " + size); } catch (IOException e) {     System.err.println(e); }

  下面是一些基本的屬性列表。

  • lastModifiedTime
  • lastAccessTime
  • creationTime
  • size
  • isRegularFile
  • isDirectory
  • isSymbolicLink
  • isOther
  • fileKey

  更新一個(gè)基本屬性

  可以使用setTimes() 來(lái)更新任何或是所有文件的最后修改日期,上次訪問日期,還有創(chuàng)建日期。這個(gè)方法用FileTime類的實(shí)例來(lái)表示這三個(gè)時(shí)間。如果三個(gè)參數(shù)

lastModifiedTime, lastAccessTim 或 creationTime 設(shè)置為null,那么對(duì)應(yīng)的時(shí)間戳不會(huì)發(fā)生改變。

 import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.FileTime; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); long time = System.currentTimeMillis(); FileTime fileTime = FileTime.fromMillis(time); try {     Files.getFileAttributeView(path,     BasicFileAttributeView.class).setTimes(fileTime, fileTime, fileTime); } catch (IOException e) {     System.err.println(e); }

  也可以使用Files.setLastModifiedTime()來(lái)更新文件的最后修改日期。

 long time = System.currentTimeMillis(); FileTime fileTime = FileTime.fromMillis(time); try {     Files.setLastModifiedTime(path, fileTime); } catch (IOException e) {     System.err.println(e); }

  還有,可以使用setAttribute() 來(lái)更新文件的最后的修改時(shí)間。實(shí)際上,這個(gè)方法還可以更新文件的最后訪問時(shí)間,和創(chuàng)建時(shí)間。

import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … try {     Files.setAttribute(path, "basic:lastModifiedTime", fileTime, NOFOLLOW_LINKS);     Files.setAttribute(path, "basic:creationTime", fileTime, NOFOLLOW_LINKS);     Files.setAttribute(path, "basic:lastAccessTime", fileTime, NOFOLLOW_LINKS); } catch (IOException e) {     System.err.println(e); }

  接下來(lái),可以使用getAttribute()方法來(lái)獲取這三個(gè)時(shí)間的屬性。

try {     FileTime lastModifiedTime = (FileTime)Files.getAttribute(path,                                  "basic:lastModifiedTime", NOFOLLOW_LINKS);     FileTime creationTime = (FileTime)Files.getAttribute(path,                                  "basic:creationTime", NOFOLLOW_LINKS);     FileTime lastAccessTime = (FileTime)Files.getAttribute(path,                                  "basic:lastAccessTime", NOFOLLOW_LINKS);     System.out.println("New last modified time: " + lastModifiedTime);     System.out.println("New creation time: " + creationTime);     System.out.println("New last access time: " + lastAccessTime); } catch (IOException e) {       System.err.println(e); } 

  DOS 視圖

  DOS視圖在basic視圖的基礎(chǔ)上拓展四個(gè)屬性,他們對(duì)應(yīng)方法如下:

  • isReadOnly()
  • isHidden()
  • isArchive():
  • isSystem()

  直接上代碼:

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.DosFileAttributes; ... DosFileAttributes attr = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     attr = Files.readAttributes(path, DosFileAttributes.class); } catch (IOException e) {     System.err.println(e); } System.out.println("Is read only ? " + attr.isReadOnly()); System.out.println("Is Hidden ? " + attr.isHidden()); System.out.println("Is archive ? " + attr.isArchive()); System.out.println("Is system ? " + attr.isSystem());

  也可以設(shè)置單一的屬性,對(duì)應(yīng)的屬性列表如下:

  • hidden
  • readonly
  • system
  • archive

  代碼演示:

import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … //setting the hidden attribute to true try {     Files.setAttribute(path, "dos:hidden", true, NOFOLLOW_LINKS); } catch (IOException e) {     System.err.println(e); } //getting the hidden attribute try {     boolean hidden = (Boolean) Files.getAttribute(path, "dos:hidden", NOFOLLOW_LINKS);     System.out.println("Is hidden ? " + hidden); } catch (IOException e) {      System.err.println(e); }

   文件擁有者視圖

  大多數(shù)文件系統(tǒng)接受文件所有者身份的概念用于確定對(duì)象的訪問權(quán)限。NIO.2通過(guò)UserPrincipal這個(gè)接口映射了這個(gè)概念,并且允許你使用FileOwnerAttributeView接口獲取和設(shè)置文件的擁有者。如下面代碼所示,有多種方法來(lái)獲取和設(shè)置一個(gè)文件的所有者權(quán)限。

  使用Files.setOwner()方法來(lái)設(shè)置一個(gè)文件的擁有者。除了文件路徑,這個(gè)方法獲取UserPrincipal的實(shí)例用來(lái)映射文件擁有者的字符串表示。用戶主名默認(rèn)系統(tǒng)的服務(wù)通過(guò)FileSystem.getUserPrincipalLookupService()方法。下面是具體的例子。

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.UserPrincipal; ... UserPrincipal owner = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     owner = path.getFileSystem().getUserPrincipalLookupService().                                        lookupPrincipalByName("apress"); // apress is a file owner, you can set the file owner according to you machine.     Files.setOwner(path, owner); } catch (IOException e) {     System.err.println(e); } 

  使用 FileOwnerAttributeView.setOwner()方法設(shè)置文件擁有者

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileOwnerAttributeView; import java.nio.file.attribute.UserPrincipal; ... UserPrincipal owner = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); FileOwnerAttributeView foav = Files.getFileAttributeView(path,                                             FileOwnerAttributeView.class); try {     owner = path.getFileSystem().getUserPrincipalLookupService().                                  lookupPrincipalByName("apress");     foav.setOwner(owner); } catch (IOException e) {     System.err.println(e); } 

  使用Files.setAttribute()來(lái)設(shè)置文件擁有者

owner:owner, as you can see here:import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.UserPrincipal; import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … UserPrincipal owner = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {     owner = path.getFileSystem().getUserPrincipalLookupService().                                  lookupPrincipalByName("apress");     Files.setAttribute(path, "owner:owner", owner, NOFOLLOW_LINKS); } catch (IOException e) {     System.err.println(e); } 

  使用FileOwnerAttributeView.getOwner()方法獲取文件擁有者

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileOwnerAttributeView; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); FileOwnerAttributeView foav = Files.getFileAttributeView(path,                                          FileOwnerAttributeView.class); try {     String owner = foav.getOwner().getName();     System.out.println(owner); } catch (IOException e) {     System.err.println(e); } 

  也可以使用 Files.getAttribute()方法獲取文件的擁有者

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.UserPrincipal; import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try {                 UserPrincipal owner = (UserPrincipal) Files.getAttribute(path,                                                 "owner:owner", NOFOLLOW_LINKS);     System.out.println(owner.getName());     } catch (IOException e) {         System.err.println(e);     } 

  POSIX視圖

  給Unix粉絲們帶來(lái)了好消息。POSIX視圖在繼承了basic視圖的基礎(chǔ)上擴(kuò)展了自己的屬性。包括文件擁有者,文件所屬組,以及其他9個(gè)相關(guān)的訪問權(quán)限。

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.PosixFileAttributes; … PosixFileAttributes attr = null; Path path = Paths.get("/home/rafaelnadal/tournaments/2009/BNP.txt"); try {     attr = Files.readAttributes(path, PosixFileAttributes.class); } catch (IOException e) {     System.err.println(e); } System.out.println("File owner: " + attr.owner().getName()); System.out.println("File group: " + attr.group().getName()); System.out.println("File permissions: " + attr.permissions().toString());

  也可以使用Files.getFileAttributeView()方法。

import java.nio.file.attribute.PosixFileAttributeView; … try {     attr = Files.getFileAttributeView(path,                   PosixFileAttributeView.class).readAttributes(); } catch (IOException e) {     System.err.println(e); } 

  permissions()方法返回了PosixFilePermissions對(duì)象的一個(gè)集合。PosixFilePermissions是一個(gè)權(quán)限幫助類。其中一個(gè)比較有用的方法是asFileAttribute(),它可以接受一個(gè)文件屬性構(gòu)建的權(quán)限的set對(duì)象傳遞給 Path.createFile()或 Path.createDirectory()方法。如下例所示,你可以獲取一個(gè)文件的POSIX權(quán)限并且使用這個(gè)相同的權(quán)限去創(chuàng)建一個(gè)新的文件。

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFileAttributes; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.Set; … Path new_path = Paths.get("/home/rafaelnadal/tournaments/2009/new_BNP.txt"); FileAttribute<Set<PosixFilePermission>> posixattrs =                          PosixFilePermissions.asFileAttribute(attr.permissions()); try {     Files.createFile(new_path, posixattrs); } catch (IOException e) {     System.err.println(e); }

  還可以使用fromString()方法傳遞一個(gè)硬編碼的字符串權(quán)限信息。

Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rw-r--r--"); try {     Files.setPosixFilePermissions(new_path, permissions); } catch (IOException e) {     System.err.println(e); }

 POSIX組擁有者

 文件組擁有者可以使用屬性名為“group”來(lái)設(shè)置。setGroup()方法得到文件的路徑和一個(gè)GroupPrincipal實(shí)例,這個(gè)實(shí)例映射一個(gè)字符串代表組所有者。

import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.GroupPrincipal; import java.nio.file.attribute.PosixFileAttributeView; … Path path = Paths.get("/home/rafaelnadal/tournaments/2009/BNP.txt"); try {     GroupPrincipal group = path.getFileSystem().                getUserPrincipalLookupService().lookupPrincipalByGroupName("apressteam");     Files.getFileAttributeView(path, PosixFileAttributeView.class).setGroup(group); } catch (IOException e) {     System.err.println(e); }

  你可以很容易地使用Files.getAttribute()方法來(lái)獲取組的屬性。

import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … try {     GroupPrincipal group = (GroupPrincipal) Files.getAttribute(path, "posix:group",                                                                        NOFOLLOW_LINKS);     System.out.println(group.getName()); } catch (IOException e) {     System.err.println(e); }

   除此而外,還有ACL視圖,文件存儲(chǔ)視圖,用戶自定義視圖,基本上用法跟上面視圖類似,不再詳敘。

  完。

 

 

 

  

  

 


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西和县| 格尔木市| 夏津县| 海城市| 沂源县| 敦化市| 台南市| 阿拉尔市| 武汉市| 乐至县| 诸城市| 蒙城县| 烟台市| 京山县| 顺昌县| 陵川县| 柯坪县| 堆龙德庆县| 镇康县| 密云县| 福清市| 永城市| 天峻县| 唐海县| 丹江口市| 中宁县| 那曲县| 安新县| 根河市| 鸡泽县| 精河县| 芒康县| 政和县| 阿克陶县| 额济纳旗| 仁寿县| 墨竹工卡县| 珲春市| 南乐县| 罗江县| 永靖县|