Java 文件属性

Java IO教程 - Java文件属性


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类中的File Attribute View()方法文件存储器是否支持特定文件属性视图。

如果支持指定的文件属性视图,则返回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.");
    }

  }
}

上面的代码生成以下结果。

例子

以下代码显示如何检查文件存储的支持的文件属性视图。

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);
  }
}

上面的代码生成以下结果。

读取和更新文件属性

要读取或更新一个文件属性,请使用Files类。

Files类具有以下两种静态方法,以使用属性名称作为字符串来读取和更新文件属性:

Object getAttribute(Path path, String attribute, LinkOption... options)
Path setAttribute(Path path, String attribute, Object value, LinkOption... options)

要读取或更新文件的多个属性,请使用特定的文件属性视图。

对于大多数文件属性视图,我们必须使用名为 TypeAttributes和 TypeAttributeView的两个接口。

对于基本文件属性,我们有BasicFileAttributes和BasicFileAtrributeView接口。

Type Attributes读取的属性。该Type AttributeView读取/更新的属性。

以下两个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();
    }
  }
}