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"))
}
}
实例-2
以下代码读取文件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()
方法读取该视图类型的所有属性。
实施例3
以下代码使用基本视图对象读取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()
}
}
}