欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

[NIO.2] 第十二篇 NIO.2 属性视图之 Basic View

程序员文章站 2022-04-28 17:36:12
...
大多数的文件系统都支持一些通用文件属性(文件大小、文件创建时间、最后访问时间、最后编辑时间、等等)。这些通用属性都被分组到  BasicFileAttributeView 中,下面将介绍如何读取和设置这些属性。

使用 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/
相关标签: Java Java NIO.2