[NIO.2] 第十二篇 NIO.2 属性视图之 Basic View
程序员文章站
2022-04-28 17:36:12
...
大多数的文件系统都支持一些通用文件属性(文件大小、文件创建时间、最后访问时间、最后编辑时间、等等)。这些通用属性都被分组到 BasicFileAttributeView 中,下面将介绍如何读取和设置这些属性。
使用 readAttributes() 方法批量获取属性
可以通过调用 readAttributes() 方法来批量读取文件属性,这个方法如果使用不定长参数,那么默认就是使用了 LinkOption.NOFOLLOW_LINKS 这个枚举类型——这表示将不会处理符号链接所链接的文件,而只会处理符号链接本身的文件。
使用 getAttribute() 方法获取单个属性
如果你需要获取单个属性而不是获取全部的属性,那么可以使用 getAttribute() 方法。这个方法可传入文件的 path 对象、需要获取的属性名称和是否需要支持符号链接。下面的代码片段将演示如何获取文件大小。记住 getAttribute() 方法的返回值是 Object 类型,因此你需要对结果进行强制转换:
Basic 属性视图支持的属性名称如下:
如上面例子中所示,获取属性的格式为 [view-name:]attribute-name。在上面的例子中 view-name 是 basic,attribute-name 是 size。
编辑基本属性
更新文件的最后编辑时间、最后访问时间和创建时间属性可以调用 setTimes() 方法,这个方法的三个参数分别对应了最后编辑时间、最后访问时间以及创建时间。参数接受 FileTime 类型的对象,这个类是在 Java 7 中新引进的用来表示文件时间戳属性的类。如果不需要变更其中某个时间,则可以设置为 null。
更新文件的最后编辑时间也可以调用 Files.setLastModifiedTime() 方法:
当然也可以通过通用的 setAttribute() 来更新文件的最后编辑时间,另外文件最后访问时间和文件创建时间也可以通过这个方法来设置:
现在,你可以检查文件的这三个属性是否已经改变。可以调用 getAttribute() 方法进行查看:
文章来源:http://www.aptusource.org/2014/03/nio-2-basic-view/
使用 readAttributes() 方法批量获取属性
可以通过调用 readAttributes() 方法来批量读取文件属性,这个方法如果使用不定长参数,那么默认就是使用了 LinkOption.NOFOLLOW_LINKS 这个枚举类型——这表示将不会处理符号链接所链接的文件,而只会处理符号链接本身的文件。
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; … BasicFileAttributes attr = null; Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try { attr = Files.readAttributes(path, BasicFileAttributes.class); } catch (IOException e) { System.err.println(e); } System.out.println("File size: " + attr.size()); System.out.println("File creation time: " + attr.creationTime()); System.out.println("File was last accessed at: " + attr.lastAccessTime()); System.out.println("File was last modified at: " + attr.lastModifiedTime()); System.out.println("Is directory? " + attr.isDirectory()); System.out.println("Is regular file? " + attr.isRegularFile()); System.out.println("Is symbolic link? " + attr.isSymbolicLink()); System.out.println("Is other? " + attr.isOther());
使用 getAttribute() 方法获取单个属性
如果你需要获取单个属性而不是获取全部的属性,那么可以使用 getAttribute() 方法。这个方法可传入文件的 path 对象、需要获取的属性名称和是否需要支持符号链接。下面的代码片段将演示如何获取文件大小。记住 getAttribute() 方法的返回值是 Object 类型,因此你需要对结果进行强制转换:
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); try { long size = (Long)Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS); System.out.println("Size: " + size); } catch (IOException e) { System.err.println(e); }
Basic 属性视图支持的属性名称如下:
- lastModifiedTime
- lastAccessTime
- creationTime
- size
- isRegularFile
- isDirectory
- isSymbolicLink
- isOther
- fileKey
如上面例子中所示,获取属性的格式为 [view-name:]attribute-name。在上面的例子中 view-name 是 basic,attribute-name 是 size。
编辑基本属性
更新文件的最后编辑时间、最后访问时间和创建时间属性可以调用 setTimes() 方法,这个方法的三个参数分别对应了最后编辑时间、最后访问时间以及创建时间。参数接受 FileTime 类型的对象,这个类是在 Java 7 中新引进的用来表示文件时间戳属性的类。如果不需要变更其中某个时间,则可以设置为 null。
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.FileTime; … Path path = Paths.get("C:/rafaelnadal/tournaments/2009", "BNP.txt"); long time = System.currentTimeMillis(); FileTime fileTime = FileTime.fromMillis(time); try { Files.getFileAttributeView(path, BasicFileAttributeView.class).setTimes(fileTime, fileTime, fileTime); } catch (IOException e) { System.err.println(e); }
更新文件的最后编辑时间也可以调用 Files.setLastModifiedTime() 方法:
long time = System.currentTimeMillis(); FileTime fileTime = FileTime.fromMillis(time); try { Files.setLastModifiedTime(path, fileTime); } catch (IOException e) { System.err.println(e); }
当然也可以通过通用的 setAttribute() 来更新文件的最后编辑时间,另外文件最后访问时间和文件创建时间也可以通过这个方法来设置:
import static java.nio.file.LinkOption.NOFOLLOW_LINKS; … try { Files.setAttribute(path, "basic:lastModifiedTime", fileTime, NOFOLLOW_LINKS); Files.setAttribute(path, "basic:creationTime", fileTime, NOFOLLOW_LINKS); Files.setAttribute(path, "basic:lastAccessTime", fileTime, NOFOLLOW_LINKS); } catch (IOException e) { System.err.println(e); }
现在,你可以检查文件的这三个属性是否已经改变。可以调用 getAttribute() 方法进行查看:
try { FileTime lastModifiedTime = (FileTime)Files.getAttribute(path, "basic:lastModifiedTime", NOFOLLOW_LINKS); FileTime creationTime = (FileTime)Files.getAttribute(path, "basic:creationTime", NOFOLLOW_LINKS); FileTime lastAccessTime = (FileTime)Files.getAttribute(path, "basic:lastAccessTime", NOFOLLOW_LINKS); System.out.println("New last modified time: " + lastModifiedTime); System.out.println("New creation time: " + creationTime); System.out.println("New last access time: " + lastAccessTime); } catch (IOException e) { System.err.println(e); }
文章来源:http://www.aptusource.org/2014/03/nio-2-basic-view/