Files
類可以存取常用的檔案屬性。Files.isHidden(Path p)
方法測試檔案是否被隱藏。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
包中包含檔案屬性相關的類。它在以下六種型別的檢視中綑綁檔案屬性。
BasicFileAttributeView
管理基本檔案屬性,如建立時間,上次存取時間,上次修改時間,大小,檔案型別(常規檔案,目錄,符號連結或其他)和檔案鍵(檔案的唯一編號)。 所有平台都支援此檢視。
DosFileAttributeView
擴充套件BasicFileAttributeView
存取特定於DOS檔案屬性。 它提供了支援以檢查檔案是否是隱藏檔案,系統檔案,歸檔檔案和唯讀檔案。 它僅在支援DOS系統(如Microsoft Windows)上可用。
POSIX
代表UNIX的便攜式作業系統介面。 PosixFileAttributeView
擴充套件了BasicFileAttributeView
,並新增了對支援POSIX標準(如UNIX)的系統上可用的屬性的支援。它允許我們管理所有者,組和[相關存取]許可權。
FileOwnerAttributeView
管理檔案的所有者。ACL代表存取控制列表。 AclFileAttributeView
管理檔案的ACL。UserDefinedFileAttributeView
管理一組檔案的使用者定義屬性。 屬性的名稱是一個字串。屬性的值可以是任何資料型別。
FileStore
類的supportsFileAttributeView()
方法告訴檔案儲存器是否支援特定檔案屬性檢視。如果支援指定的檔案屬性檢視,則返回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.");
}
}
}
上面的程式碼生成以下結果。
POSIX file attribute view is not supported.
以下程式碼顯示如何檢查檔案儲存的支援的檔案屬性檢視。
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);
}
}
上面的程式碼生成以下結果。
AclFileAttributeView is supported: true
BasicFileAttributeView is supported: true
DosFileAttributeView is supported: true
FileOwnerAttributeView is supported: true
PosixFileAttributeView is supported: false
UserDefinedFileAttributeView is supported: true
要讀取或更新一個檔案屬性,請使用Files
類。Files
類具有以下兩種靜態方法,使用屬性名稱作為字串來讀取和更新檔案屬性:
Object getAttribute(Path path, String attribute, LinkOption... options)
Path setAttribute(Path path, String attribute, Object value, LinkOption... options)
要讀取或更新檔案的多個屬性,請使用特定的檔案屬性檢視。對於大多數檔案屬性檢視,可使用名為TypeAttributes
和TypeAttributeView
這兩個介面。對於基本檔案屬性,有BasicFileAttributes
和BasicFileAtrributeView
介面。TypeAttributes
讀取屬性。TypeAttributeView
讀取/更新屬性。
以下是Files
類兩個方法批次讀取檔案屬性。
<A extends BasicFileAttributes> A readAttributes(Path path, Class<A> type, LinkOption... options)
Map<String,Object> readAttributes(Path path, String attributes, LinkOption... options)
兩種方法的最後一個引數指定如何處理符號連結。預設情況下,如果檔案是符號連結,則讀取符號連結的目標屬性。
如果指定NOFOLLOW_LINKS
作為選項,則讀取符號連結的屬性,而不是其目標的屬性。
第一個readAttributes()
方法返回TypeAttributes
物件中指定型別的所有檔案屬性。建立表示檔案路徑的Path
物件
Path path = Paths.get("C:\\Java_Dev\\test1.txt");
讀取基本檔案屬性
BasicFileAttributes bfa = Files.readAttributes(path, BasicFileAttributes.class);
獲取上次修改時間
FileTime lastModifiedTime = bfa.lastModifiedTime();
獲取檔案的大小
long size = bfa.size();
第二個readAttributes()
方法返回特定型別的所有或部分屬性。要讀取的屬性列表以字串形式提供。 屬性列表的字串形式使用以下語法:
view-name:comma-separated-attributes
view-name
是要讀取的屬性檢視的名稱,例如basic
,posix
,acl
等。如果省略view-name
,則預設為basic
。 如果view-name
存在,它後面跟一個冒號。
通過將星號指定為屬性列表,可以讀取特定檢視型別的所有屬性。 例如,可以指定「basic:*
」或「*
」來讀取所有基本檔案屬性。要讀取基本檢視的大小和最後修改時間,可使用 -
"basic:size,lastModifiedTime" or "size,lastModifiedTime".
要使用ACL檢視讀取檔案的owner
屬性,那麼可使用字串「acl:owner
」。要讀取檔案的所有posix
屬性,那麼可使用「posix:*
」。
以下程式碼列印檔案 C:\Java_Dev\test1.txt
的大小和最後修改時間。
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
的基本檔案屬性,並在標準輸出上列印其中的一些。
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();
}
}
}
還可以使用指定的檢視物件讀取檔案屬性。使用如下的Files
類的getFileAttributeView()
方法來獲取特定的屬性檢視。如果檔案屬性檢視不可用,則返回null
。
<V extends FileAttributeView> V getFileAttributeView(Path path, Class<V> type, LinkOption... options)
獲得特定檢視型別的檢視物件後,可以使用檢視物件的readAttributes()
方法讀取該檢視型別的所有屬性。
以下程式碼使用基本檢視物件讀取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();
}
}
}