367. Java IO API - 管理文件属性
文件属性(File Attributes)指的是文件系统存储的有关文件的元数据。这些属性描述了文件的基本信息,如大小、修改时间、文件权限、拥有者等。java.nio.file.Files 类提供了一组方法来获取和设置文件的属性。
🛠️ 文件和文件存储属性
文件系统的属性通常包括以下内容:
| 方法 | 说明 |
|---|---|
size(Path) | 返回指定文件的大小(以字节为单位)。 |
isDirectory(Path, LinkOption) | 如果指定路径是一个目录,则返回 true。 |
isRegularFile(Path, LinkOption...) | 如果指定路径是一个常规文件,则返回 true。 |
isSymbolicLink(Path) | 如果指定路径是一个符号链接,则返回 true。 |
isHidden(Path) | 如果指定路径是隐藏文件,则返回 true。 |
getLastModifiedTime(Path, LinkOption...) | 获取指定文件的最后修改时间。 |
setLastModifiedTime(Path, FileTime) | 设置指定文件的最后修改时间。 |
getOwner(Path, LinkOption...) | 获取文件的所有者信息。 |
setOwner(Path, UserPrincipal) | 设置文件的所有者。 |
getPosixFilePermissions(Path, LinkOption...) | 获取文件的 POSIX 权限。 |
setPosixFilePermissions(Path, Set<PosixFilePermission>) | 设置文件的 POSIX 权限。 |
getAttribute(Path, String, LinkOption...) | 获取指定文件的某个属性值。 |
setAttribute(Path, String, Object, LinkOption...) | 设置指定文件的某个属性值。 |
例如:获取文件大小
import java.nio.file.*;
import java.io.IOException;
public class FileAttributesDemo {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
long fileSize = Files.size(filePath);
System.out.println("文件大小: " + fileSize + " 字节");
} catch (IOException e) {
System.err.println("获取文件大小失败: " + e.getMessage());
}
}
}
⚡ 批量读取文件属性
有时,我们需要在同一操作中获取多个文件属性。为了提高性能,避免多次访问文件系统,Files 类提供了 readAttributes() 方法,可以一次性读取多个文件属性。
| 方法 | 说明 |
|---|---|
readAttributes(Path, String, LinkOption...) | 作为批量操作读取文件的属性。String 参数指定要读取的属性。 |
readAttributes(Path, Class<A>, LinkOption...) | 作为批量操作读取文件的属性,Class<A> 参数指定属性类型,并返回该类型的对象。 |
例如:读取文件的多个属性
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
public class ReadFileAttributes {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
BasicFileAttributes attributes = Files.readAttributes(filePath, BasicFileAttributes.class);
System.out.println("文件创建时间: " + attributes.creationTime());
System.out.println("文件最后访问时间: " + attributes.lastAccessTime());
System.out.println("文件最后修改时间: " + attributes.lastModifiedTime());
System.out.println("文件大小: " + attributes.size() + " 字节");
} catch (IOException e) {
System.err.println("读取文件属性失败: " + e.getMessage());
}
}
}
BasicFileAttributes:此类是文件的基本属性视图,包括创建时间、最后修改时间、大小等。Files.readAttributes(filePath, BasicFileAttributes.class):批量读取文件属性并返回一个BasicFileAttributes对象。
🌍 文件系统视图
文件系统的属性是分组的,基于不同的文件系统实现或共同的功能,文件属性被组织到不同的视图中。常见的文件系统视图如下:
- BasicFileAttributeView:提供文件的基本属性视图,所有文件系统都应支持该视图。
- DosFileAttributeView:扩展了基本属性视图,包含 DOS 文件系统支持的四个标准属性位。
- PosixFileAttributeView:扩展了基本属性视图,支持 POSIX 标准的属性,如文件所有者、群组所有者和九个相关的访问权限(适用于 UNIX 系统)。
- FileOwnerAttributeView:支持获取文件的所有者属性。
- AclFileAttributeView:支持读取或更新文件的访问控制列表(ACL)。
- UserDefinedFileAttributeView:允许支持用户自定义的元数据,可以用于存储文件的 MIME 类型等信息。
例如:读取 POSIX 文件权限
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
import java.util.Set;
public class PosixFilePermissionsDemo {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
PosixFileAttributeView posixView = Files.getFileAttributeView(filePath, PosixFileAttributeView.class);
Set<PosixFilePermission> permissions = posixView.readAttributes().permissions();
System.out.println("文件的 POSIX 权限: " + permissions);
} catch (IOException e) {
System.err.println("读取文件 POSIX 权限失败: " + e.getMessage());
}
}
}
Files.getFileAttributeView(filePath, PosixFileAttributeView.class):获取文件的 POSIX 属性视图。readAttributes().permissions():读取文件的 POSIX 权限。
🧑💼 设置文件属性
除了读取文件属性,Files 类还提供了设置文件属性的方法。例如,我们可以设置文件的所有者、修改时间等。
例如:设置文件的最后修改时间
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.io.IOException;
public class SetFileAttributes {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
FileTime newTime = FileTime.fromMillis(System.currentTimeMillis());
try {
Files.setLastModifiedTime(filePath, newTime);
System.out.println("文件的最后修改时间已更新!");
} catch (IOException e) {
System.err.println("设置文件修改时间失败: " + e.getMessage());
}
}
}
Files.setLastModifiedTime(filePath, newTime):设置文件的最后修改时间。
🔑 结论
在管理文件时,Java 提供了强大的工具来读取和设置文件的各种属性。Files 类和 FileAttributeView 接口使得文件操作变得更加高效,尤其是在需要批量读取属性时。
| 操作 | 方法 | 说明 |
|---|---|---|
| 获取文件大小 | Files.size() | 获取文件的大小(以字节为单位)。 |
| 获取文件权限 | Files.getPosixFilePermissions() | 获取文件的 POSIX 权限。 |
| 获取文件所有者 | Files.getOwner() | 获取文件的所有者信息。 |
| 批量读取属性 | Files.readAttributes() | 批量读取文件的多个属性。 |
| 设置文件权限 | Files.setPosixFilePermissions() | 设置文件的 POSIX 权限。 |
通过这些方法,你可以灵活地管理文件属性,从而实现更复杂的文件系统操作。