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

Java7中那些新特性 - 3 (文件信息篇)

程序员文章站 2022-03-16 13:16:33
...
  今天我们来说说在Java7中如何获得文件的信息。我们这里说的文件信息指的是一个文件是否可以被执行,文件的大小,文件所属用户甚至是文件的内容。

  使用java.nio.file.Files类来获得文件信息的方式一共有五种:

  • 使用Files和文件信息相关的静态方法,例如isDirectory,来获得具体某种文件信息。
  • 使用Files的getAttribute静态方法来获得某一种文件信息。
  • 使用readAttributes方法来返回一个包含所有文件信息的Map对象。
  • 用一个BasicFileAttributes接口(某个具体实现类)作为参数,调用readAttributes方法来获得一个包含文件信息的BasicFileAttributes对象。
  • 使用getFileAttributeView方法,获得一个详尽的文件信息集合。


  Java7引入了一系列关于文件视图的接口。一个文件视图(View)简单来说就组织文件(或者文件夹)信息的一种方式。例如AclFileAttributeView,提供了和文件Access Control List (ACL)相关的方法。FileAttributeView接口是其它所有文件信息接口的父接口。java.nio.file.attribute包下关于View的接口如下:

  • AclFileAttributeView: 用于维护文件的访问控制列表(ACL)和文件所属的一些信息
  • BasicFileAttributeView: 用于访问文件的一些基本信息,设置和时间相关的一些属性
  • DosFileAttributeView: 为遗留的DOS文件系统而设计
  • FileOwnerAttributeView: 用于维护文件的所属(属于哪个用户)信息
  • PosixFileAttributeView: 用来支持可移植性操作系统接口(Portable Operating System Interface)
  • UserDefinedFileAttributeView: 用来支持用户定义的文件信息


  这里我们首先来看看如何获得文件内容的类型。通常情况下文件内容类型可以通过扩展名来获得。例如txt文件是文本文件,exe文件则是Windows下的可执行文件。但我们可以将一个txt文件重命名成exe文件,这并不能改变文件内容的类型。因此通过文件的扩展名来获得其类型有一定的误导性。Files类的probeContentType就是用来获得文件内容类型的。

    public static void main(String[] args) throws Exception {
        displayContentType("D:/home/projects/note.txt");
        displayContentType("D:/home/projects/Chapter 2.doc");
        displayContentType("D:/home/projects/java.exe");
    }

    static void displayContentType(String pathText) throws Exception {
        Path path = Paths.get(pathText);
        String type = Files.probeContentType(path);
        System.out.println(type);
    }


  接下来我们要使用不同的方法,获得文件的具体属性。首先是如何获得我们指定的某种属性,即调用一次方法获得一个文件属性。

public static void main(String[] args) {
    try {
        Path path = Paths.get("D:/home/projects/note.txt");
        System.out.println(Files.getAttribute(path, "size"));
    } catch (IOException ex) {
        System.out.println("IOException");
    }
}


  这里getAttribute方法的第二参数指定了具体需要返回哪种文件信息。可使用的参数值如下表

参数值 返回值类型
lastModifiedTime FileTime
lastAccessTime FileTime
creationTime FileTime
size long
isRegularFile Boolean
isDirectory Boolean
isSymbolicLink Boolean
isOther Boolean
fileKey Object


  通过调用Files.readAttributes方法,返回包含文件信息的Map对象。

    public static void main(String[] args) {

        Path path = Paths.get("D:/home/projects/note.txt");
        try {
            Map<String, Object> attrsMap = Files.readAttributes(path, "*");
            Set<String> keys = attrsMap.keySet();
            for (String attribute : keys) {
                System.out.println(attribute + ": " + Files.getAttribute(path, attribute));
            }
        } catch (IOException exception) {
            System.out.println("IOException");
        }
    }

  示例中readAttributes方法第二个参数由一个视图信息的名称和一个具体属性组成,中间由冒号(:)隔开,例如"posix:permissions,owner,size"。"*"则代表所有属性。具体的参数使用方式请参见JDK文档,这里就不做过多介绍了。

  前文中我们提到了文件视的图信息(Attribute View),一个操作系统可能不是支持Java中定义的所有文件视图信息的。可以通过下面的代码来查看当前系统所支持的视图信息。

    public static void main(String[] args) {

        Path path = Paths.get("D:/home/projects/note.txt");
        FileSystem fileSystem = path.getFileSystem();
        Set<String> supportedViews = fileSystem.supportedFileAttributeViews();

        for (String view : supportedViews) {
            System.out.println(view);
        }
    }


  基于不同的操作系统,上例的代码运行结果有所不同。Windows7中是acl basic owner user dos,Linux中则会是basic owner user unix dos posix。
 
  想要获得不同的FileAttributeView接口,我们可以通过Files的readAttributes方法,如下例:

    public static void main(String[] args) {

        Path path = Paths.get("D:/home/projects/note.txt");

        try {

            BasicFileAttributes attributes = Files.readAttributes(path, BasicFileAttributes.class);

            System.out.println("Creation Time: " + attributes.creationTime());
            System.out.println("Last Accessed Time: " + attributes.lastAccessTime());
            System.out.println("Last Modified Time: " + attributes.lastModifiedTime());
            System.out.println("File Key: " + attributes.fileKey());
            System.out.println("Directory: " + attributes.isDirectory());
            System.out.println("Other Type of File: " + attributes.isOther());
            System.out.println("Regular File: " + attributes.isRegularFile());
            System.out.println("Symbolic File: " + attributes.isSymbolicLink());
            System.out.println("Size: " + attributes.size());

        } catch (IOException exception) {
            System.out.println("Attribute error");
        }
    }


  至此,我们对如何获得系统文件信息有了一个大概的了解,具体如何获得和使用各种FileAttributeView接口我们就不过多介绍了,毕竟在我们平时的编程工作中,能涉及到底层文件格式以及信息处理的时候并不多,更多的则是如何操纵一个文件。今后的博客我们会继续讨论。
相关标签: java7