Files類可以訪問常用的文件屬性。
Files.isHidden(Path p)方法測(cè)試文件是否被隱藏。
Files類中的以下方法可以訪問文件的各種類型的常用屬性。
long size(Path) boolean isHidden(Path path) boolean isRegularFile(Path path, LinkOption... options) boolean isDirectory(Path path, LinkOption... options) boolean isSymbolicLink(Path path) FileTime getLastModifiedTime(Path path, LinkOption... options)
java.nio.attribute包包含屬性相關(guān)的類。它在以下六種類型的視圖中捆綁文件屬性。
BasicFileAttributeView管理基本文件屬性,如創(chuàng)建時(shí)間,上次訪問時(shí)間,上次修改時(shí)間,大小,文件類型(常規(guī)文件,目錄,符號(hào)鏈接或其他)和文件鍵(文件的唯一編號(hào))。所有平臺(tái)都支持此視圖。
DosFileAttributeView擴(kuò)展BasicFileAttributeView訪問特定于DOS的文件屬性。它提供了支持以檢查文件是否是隱藏文件,系統(tǒng)文件,歸檔文件和只讀文件。它僅在支持DOS的系統(tǒng)(如Microsoft Windows)上可用。
POSIX代表UNIX的便攜式操作系統(tǒng)接口。PosixFileAttributeView擴(kuò)展了BasicFileAttributeView并添加了對(duì)支持POSIX標(biāo)準(zhǔn)(如UNIX)的系統(tǒng)上可用的屬性的支持。 它允許我們管理所有者,組和[相關(guān)訪問]權(quán)限。
FileOwnerAttributeView管理文件的所有者。
ACL代表訪問控制列表。AclFileAttributeView管理文件的ACL。
UserDefinedFileAttributeView管理一組文件的用戶定義屬性。屬性的名稱是一個(gè)字符串。屬性的值可以是任何數(shù)據(jù)類型。
支持FileStore類中的File Attribute View()方法文件存儲(chǔ)器是否支持特定文件屬性視圖。
如果支持指定的文件屬性視圖,則返回true; 否則,返回false。
以下代碼顯示如何檢查文件屬性支持。
import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.PosixFileAttributeView; public class Main { public static void main(String[] args) throws Exception { Path path = Paths.get(""); FileStore fs = Files.getFileStore(path); // Check if POSIX file attribute is supported by the file store boolean supported = fs .supportsFileAttributeView(PosixFileAttributeView.class); if (supported) { System.out.println("POSIX file attribute view is supported."); } else { System.out.println("POSIX file attribute view is not supported."); } } }
上面的代碼生成以下結(jié)果。
以下代碼顯示如何檢查文件存儲(chǔ)的支持的文件屬性視圖。
import java.io.IOException; import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.AclFileAttributeView; import java.nio.file.attribute.BasicFileAttributeView; import java.nio.file.attribute.DosFileAttributeView; import java.nio.file.attribute.FileAttributeView; import java.nio.file.attribute.FileOwnerAttributeView; import java.nio.file.attribute.PosixFileAttributeView; import java.nio.file.attribute.UserDefinedFileAttributeView; public class Main { public static void main(String[] args) { Path path = Paths.get("C:"); try { FileStore fs = Files.getFileStore(path); printDetails(fs, AclFileAttributeView.class); printDetails(fs, BasicFileAttributeView.class); printDetails(fs, DosFileAttributeView.class); printDetails(fs, FileOwnerAttributeView.class); printDetails(fs, PosixFileAttributeView.class); printDetails(fs, UserDefinedFileAttributeView.class); } catch (IOException ex) { ex.printStackTrace(); } } public static void printDetails(FileStore fs, Class<? extends FileAttributeView> attribClass) { boolean supported = fs.supportsFileAttributeView(attribClass); System.out.format("%s is supported: %s%n", attribClass.getSimpleName(), supported); } }
上面的代碼生成以下結(jié)果。
要讀取或更新一個(gè)文件屬性,請(qǐng)使用Files類。
Files類具有以下兩種靜態(tài)方法,以使用屬性名稱作為字符串來讀取和更新文件屬性:
Object getAttribute(Path path, String attribute, LinkOption... options) Path setAttribute(Path path, String attribute, Object value, LinkOption... options)
要讀取或更新文件的多個(gè)屬性,請(qǐng)使用特定的文件屬性視圖。
對(duì)于大多數(shù)文件屬性視圖,我們必須使用名為 Type
Attributes和 Type
AttributeView的兩個(gè)接口。
對(duì)于基本文件屬性,我們有BasicFileAttributes和BasicFileAtrributeView接口。
該Type
Attributes讀取的屬性。該Type
AttributeView讀取/更新的屬性。
以下兩個(gè)Files類的方法批量讀取文件屬性。
<A extends BasicFileAttributes> A readAttributes(Path path, Class<A> type, LinkOption... options) Map<String,Object> readAttributes(Path path, String attributes, LinkOption... options)
兩種方法的最后一個(gè)參數(shù)指定如何處理符號(hào)鏈接。默認(rèn)情況下,如果文件是符號(hào)鏈接,則讀取符號(hào)鏈接的目標(biāo)屬性。
如果我們指定NOFOLLOW_LINKS作為選項(xiàng),則讀取符號(hào)鏈接的屬性,而不是其目標(biāo)的屬性。
第一個(gè)readAttributes()方法返回 Type
Attributes對(duì)象中指定類型的所有文件屬性。
創(chuàng)建表示文件路徑的Path對(duì)象
Path path = Paths.get("C:\\Java_Dev\\test1.txt");
讀取基本文件屬性
BasicFileAttributes bfa = Files.readAttributes(path, BasicFileAttributes.class);
獲取上次修改時(shí)間
FileTime lastModifiedTime = bfa.lastModifiedTime();
獲取文件的大小
long size = bfa.size();
第二個(gè)readAttributes()方法返回特定類型的所有或部分屬性。
要讀取的屬性列表以字符串形式提供。屬性列表的字符串形式使用以下語法:
view-name:comma-separated-attributes
view-name
是我們要讀取的屬性視圖的名稱,例如basic,posix,acl等。
如果省略view-name,則默認(rèn)為basic。如果view-name存在,它后面跟一個(gè)冒號(hào)。
通過將星號(hào)指定為屬性列表,我們可以讀取特定視圖類型的所有屬性。例如,我們可以指定“basic:*”或“*”來讀取所有基本文件屬性。
要讀取基本視圖的大小和最后修改時(shí)間,我們將使用
"basic:size,lastModifiedTime" or "size,lastModifiedTime".
要使用ACL視圖讀取文件的owner屬性,我們將使用字符串“acl:owner”。
要讀取文件的所有posix屬性,我們將使用“posix:*"。
以下代碼打印文件C:\Java_Dev\test1.txt的大小和最后修改時(shí)間。
import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; public class Main { public static void main(String[] args) throws Exception { Path path = Paths.get("C:\\Java_Dev\\test1.txt"); // Prepare the attribute list String attribList = "basic:size,lastModifiedTime"; // Read the attributes Map<String, Object> attribs = Files.readAttributes(path, attribList); System.out.format("Size:%s, Last Modified Time:%s %n", attribs.get("size"), attribs.get("lastModifiedTime")); } }
以下代碼讀取文件C:\Java_Dev\test1.txt的基本文件屬性,并在標(biāo)準(zhǔ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.BasicFileAttributes; public class Main { public static void main(String[] args) { Path path = Paths.get("C:\\Java_Dev\\test1.txt"); try { BasicFileAttributes bfa = Files.readAttributes(path, BasicFileAttributes.class); System.out.format("Size:%s bytes %n", bfa.size()); System.out.format("Creation Time:%s %n", bfa.creationTime()); System.out.format("Last Access Time:%s %n", bfa.lastAccessTime()); } catch (IOException e) { e.printStackTrace(); } } }
我們還可以使用特定的視圖對(duì)象讀取文件屬性。
我們可以使用如下的Files類的getFileAttributeView()方法來獲取特定的屬性視圖。如果文件屬性視圖不可用,則返回null。
<V extends FileAttributeView> V getFileAttributeView(Path path, Class<V> type, LinkOption... options)
在獲得特定視圖類型的視圖對(duì)象之后,我們可以使用視圖對(duì)象的readAttributes()方法讀取該視圖類型的所有屬性。
以下代碼使用基本視圖對(duì)象讀取C:\Java_Dev\test1.txt文件的所有基本屬性:
Path path = Paths.get("C:\\Java_Dev\\test1.txt"); BasicFileAttributeView bfv = Files.getFileAttributeView(path, BasicFileAttributeView.class); BasicFileAttributes bfa = bfv.readAttributes();
以下代碼顯示如何使用基本文件屬性視圖來讀取和更新基本文件屬性。
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.BasicFileAttributes; import java.nio.file.attribute.FileTime; import java.time.Instant; public class Main { public static void main(String[] args) { Path path = Paths.get("C:\\Java_Dev\\test1.txt"); try { BasicFileAttributeView bfv = Files.getFileAttributeView(path, BasicFileAttributeView.class); BasicFileAttributes bfa = bfv.readAttributes(); System.out.format("Size:%s bytes %n", bfa.size()); System.out.format("Creation Time:%s %n", bfa.creationTime()); System.out.format("Last Access Time:%s %n", bfa.lastAccessTime()); FileTime newLastModifiedTime = null; FileTime newLastAccessTime = null; FileTime newCreateTime = FileTime.from(Instant.now()); bfv.setTimes(newLastModifiedTime, newLastAccessTime, newCreateTime); } catch (IOException e) { e.printStackTrace(); } } }
更多建議: