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類的supportsFileAttributeView()方法告訴檔案儲存器是否支援特定檔案屬性檢視。如果支援指定的檔案屬性檢視,則返回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.");
    }

  }
}

上面的程式碼生成以下結果。

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

上面的程式碼生成以下結果。

AclFileAttributeView is  supported: true
BasicFileAttributeView is  supported: true
DosFileAttributeView is  supported: true
FileOwnerAttributeView is  supported: true
PosixFileAttributeView is  supported: false
UserDefinedFileAttributeView is  supported: true

讀取和更新檔案屬性

要讀取或更新一個檔案屬性,請使用Files類。Files類具有以下兩種靜態方法,使用屬性名稱作為字串來讀取和更新檔案屬性:

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

要讀取或更新檔案的多個屬性,請使用特定的檔案屬性檢視。對於大多數檔案屬性檢視,可使用名為TypeAttributesTypeAttributeView這兩個介面。對於基本檔案屬性,有BasicFileAttributesBasicFileAtrributeView介面。TypeAttributes讀取屬性。TypeAttributeView讀取/更新屬性。
以下是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是要讀取的屬性檢視的名稱,例如basicposixacl等。如果省略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();
    }
  }
}