如果你有很多疑問關(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;…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); }
下面是一些基本的屬性列表。
lastModifiedTimelastAccessTimecreationTimesizeisRegularFileisDirectoryisSymbolicLinkisOtherfileKey更新一個(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)的屬性列表如下:
hiddenreadonlysystemarchive代碼演示:
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ì)象傳遞給 如下例所示,你可以獲取一個(gè)文件的POSIX權(quán)限并且使用這個(gè)相同的權(quán)限去創(chuàng)建一個(gè)新的文件。Path.createFile()或 Path.createDirectory()方法。
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ǔ)視圖,用戶自定義視圖,基本上用法跟上面視圖類似,不再詳敘。
完。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注