368. Java IO API - 基本文件属性
文章目录368. Java IO API - 基本文件属性️ 使用 Files.readAttributes() 读取基本文件属性示例读取基本文件属性⏳ 设置时间戳示例设置文件的最后修改时间⚠️ 关注符号链接示例避免跟随符号链接️ fileKey() 方法示例获取文件的唯一标识符 总结368. Java IO API - 基本文件属性在文件操作中经常需要读取文件的基本属性例如创建时间、最后修改时间、文件大小等。Java 提供了Files.readAttributes()方法允许你一次性读取多个基本文件属性这样可以有效提高性能避免多次访问文件系统。️ 使用Files.readAttributes()读取基本文件属性Files.readAttributes()方法返回BasicFileAttributes类的实例该类包含了多个常用的文件属性如creationTime文件的创建时间。lastModifiedTime文件的最后修改时间。lastAccessTime文件的最后访问时间。isDirectory()文件是否为目录。isRegularFile()文件是否为常规文件。isSymbolicLink()文件是否为符号链接。size()文件的大小以字节为单位。使用Files.readAttributes()方法一次性获取这些属性比逐一获取每个属性要高效得多尤其是在需要处理大量文件时。示例读取基本文件属性importjava.nio.file.*;importjava.nio.file.attribute.*;importjava.io.IOException;publicclassBasicFileAttributesDemo{publicstaticvoidmain(String[]args){PathfilePaths.get(example.txt);try{BasicFileAttributesattrFiles.readAttributes(file,BasicFileAttributes.class);// 输出文件的时间戳和基本属性System.out.println(创建时间: attr.creationTime());System.out.println(最后访问时间: attr.lastAccessTime());System.out.println(最后修改时间: attr.lastModifiedTime());System.out.println(是否是目录: attr.isDirectory());System.out.println(是否是常规文件: attr.isRegularFile());System.out.println(是否是符号链接: attr.isSymbolicLink());System.out.println(文件大小: attr.size() 字节);}catch(IOExceptione){System.err.println(读取文件属性失败: e.getMessage());}}}BasicFileAttributes类是一个包含文件基本属性的接口常用的属性如创建时间、最后访问时间、文件大小等可以通过Files.readAttributes()方法一次性读取。注意creationTime、lastModifiedTime和lastAccessTime这三个时间戳在某些文件系统实现中可能不被支持返回的值会是实现特定的默认值。⏳ 设置时间戳在某些场景下我们可能需要修改文件的时间戳比如更新文件的最后修改时间。可以通过Files.setLastModifiedTime()方法来实现。示例设置文件的最后修改时间importjava.nio.file.*;importjava.nio.file.attribute.*;importjava.io.IOException;publicclassSetFileTimeDemo{publicstaticvoidmain(String[]args){PathfilePaths.get(example.txt);try{// 获取当前时间并转换为 FileTimelongcurrentTimeSystem.currentTimeMillis();FileTimeftFileTime.fromMillis(currentTime);// 设置文件的最后修改时间Files.setLastModifiedTime(file,ft);System.out.println(文件的最后修改时间已更新);}catch(IOExceptione){System.err.println(设置文件修改时间失败: e.getMessage());}}}FileTime.fromMillis(long)方法允许你将当前的时间戳以毫秒为单位转换为FileTime对象然后通过Files.setLastModifiedTime()方法将其设置到文件上。⚠️ 关注符号链接使用Files.readAttributes()方法时若文件路径指向符号链接默认会返回符号链接的属性。如果你不希望访问符号链接的目标文件可以使用LinkOption.NOFOLLOW_LINKS参数来避免跟随符号链接。示例避免跟随符号链接importjava.nio.file.*;importjava.nio.file.attribute.*;importjava.io.IOException;publicclassAvoidSymbolicLinkFollow{publicstaticvoidmain(String[]args){PathfilePaths.get(symlink.txt);try{BasicFileAttributesattrFiles.readAttributes(file,BasicFileAttributes.class,LinkOption.NOFOLLOW_LINKS);// 输出符号链接的属性System.out.println(是否是符号链接: attr.isSymbolicLink());}catch(IOExceptione){System.err.println(读取符号链接属性失败: e.getMessage());}}}LinkOption.NOFOLLOW_LINKS参数确保读取的是符号链接本身的属性而不是它指向的目标文件的属性。️fileKey()方法除了读取常见的属性BasicFileAttributes还提供了fileKey()方法用于获取文件的唯一标识符。这个标识符是与文件系统相关的可以用来唯一标识文件。然而并不是所有的文件系统都支持文件键如果不可用fileKey()将返回null。示例获取文件的唯一标识符importjava.nio.file.*;importjava.nio.file.attribute.*;importjava.io.IOException;publicclassFileKeyDemo{publicstaticvoidmain(String[]args){PathfilePaths.get(example.txt);try{BasicFileAttributesattrFiles.readAttributes(file,BasicFileAttributes.class);ObjectfileKeyattr.fileKey();System.out.println(文件的唯一标识符: (fileKey!null?fileKey:无文件键));}catch(IOExceptione){System.err.println(获取文件标识符失败: e.getMessage());}}}attr.fileKey()方法返回文件的唯一标识符若文件系统不支持文件键则返回null。 总结Files.readAttributes()方法是高效读取文件基本属性的工具可以批量获取文件的创建时间、修改时间、大小等常见属性。时间戳如创建时间、最后修改时间可能会受到文件系统的支持限制。符号链接的处理可以通过LinkOption.NOFOLLOW_LINKS来避免跟随符号链接。fileKey()方法提供了一个文件的唯一标识符但并非所有文件系统都支持此功能。通过这些方法Java 提供了灵活高效的工具来管理文件属性可以大大提高文件操作的性能和可用性。