`

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

阅读更多
  今天我们来说说在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方法的第二参数指定了具体需要返回哪种文件信息。可使用的参数值如下表

参数值返回值类型
lastModifiedTimeFileTime
lastAccessTimeFileTime
creationTimeFileTime
sizelong
isRegularFileBoolean
isDirectoryBoolean
isSymbolicLinkBoolean
isOtherBoolean
fileKeyObject


  通过调用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接口我们就不过多介绍了,毕竟在我们平时的编程工作中,能涉及到底层文件格式以及信息处理的时候并不多,更多的则是如何操纵一个文件。今后的博客我们会继续讨论。
分享到:
评论

相关推荐

    java私塾跟我学系列-java篇

    9. **反射**:Java反射机制允许在运行时动态获取类的信息并操作类的对象,是Java的重要特性之一。 10. **泛型**:泛型是Java SE 5.0引入的新特性,增强了类型安全,减少类型转换的麻烦。 11. **注解(Annotation)...

    java学习教材(java私塾跟我学系列--java篇)

    ### Java学习教材(Java私塾跟我学系列--Java篇)知识点总结 #### 一、Java的历史与发展 - **Java的起源**:Java起源于Sun公司的Green项目,最初目的是为家用消费电子产品开发分布式代码系统。该项目起初尝试使用...

    Java语言基础教程-Java NIO流篇2

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,是对传统IO模型的补充和扩展。本教程将深入讲解Java NIO中的流和通道概念,以帮助开发者更好地理解和利用这一强大的功能。 首先,我们要理解Java NIO的核心组件...

    mysql-connector-java-8.0.22.jar

    本篇文章将深入探讨MySQL Connector/J 8.0.22及其在Java开发中的应用。 首先,MySQL Connector/J是MySQL官方提供的开源JDBC驱动,它完全符合JDBC 4.2规范,支持Java 8及更高版本。这个版本8.0.22包含了针对MySQL ...

    java文件传输----socket

    本篇主要介绍Java中的Socket编程,特别是如何利用Socket进行文件传输。 首先,理解Socket的基本概念。Socket可以被视为网络上的一个端点,它允许两个程序通过网络进行通信。在Java中,`java.net.Socket`类代表...

    JDK7新特性(完整篇)

    Java Development Kit (JDK) 7 是 Java 编程语言的一个重大更新,包含了多项新特性,旨在提升开发者的效率、程序的性能以及对现代计算环境的支持。以下是对这些特性的详细解析: 1. **JDK7新特性&lt;一&gt;概述** JDK7的...

    java1.7 特性实现

    在本篇文章中,我们将深入探讨Java 7的一些核心特性,并通过实际代码示例来理解它们的工作原理。 1. **自动资源管理 (try-with-resources)** Java 7引入了一个新的语法结构——`try-with-resources`,用于更有效地...

    mysql-connector-java-8.0.30-jar包

    4. **jar 文件格式**: JAR(Java Archive)文件是 Java 类库的一种打包形式,它包含了一系列的 .class 文件、相关的元数据以及资源文件。MySQL Connector/J 的 jar 文件包含了驱动所需的全部类和资源,Java 应用通过...

    eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz

    本篇将详细解析"Eclipse IDE for Java Developers",即2021年9月发布的版本,具体文件为“eclipse-java-2021-09-R-linux-gtk-x86_64.tar.gz”,针对Linux x86_64架构的系统。 首先,Eclipse Java版是专为Java开发者...

    Java语言程序设计-基础篇、进阶篇(原书第8版).pdf

    反射机制是Java的动态特性,允许在运行时检查类和对象的信息,这在某些高级场景下非常有用。最后,JDBC(Java Database Connectivity)将帮助读者学习如何通过Java与各种数据库进行交互。 本书还可能包含一些实用...

    Java语言程序设计 基础篇-进阶篇源码

    这个压缩包文件"Java语言程序设计 基础篇-进阶篇源码"显然是一个关于学习Java编程的资源集合,涵盖了从基础到进阶的全过程。下面我们将详细探讨Java编程的一些关键知识点。 首先,基础篇通常会涵盖以下内容: 1. *...

    java-tutorial-2008-03-14

    这篇教程主要涵盖了2008年3月14日时Java编程语言的关键概念和技术。Java是一种广泛使用的面向对象的编程语言,以其跨平台的能力、高效性和安全性而闻名。在这个教程中,我们将深入探讨以下几个核心主题: 1. **Java...

    深入解读Java12&13;新特性.zip

    本篇将重点解析Java 12和13中的关键新特性,帮助开发者更好地理解和运用这些改进。 **Java 12新特性** 1. **Switch Expressions (JEP 325)**: Java 12引入了开关表达式,这是对传统switch语句的扩展,使其更符合...

    JAVA程序员必读--基础篇chm

    "JAVA程序员必读--基础篇chm"这个压缩包文件显然是为那些想要深入理解Java编程基础知识的开发者准备的。CHM(Compiled Help Manual)是一种常见的Windows帮助文档格式,通常包含一系列章节和索引,便于读者按需查阅...

    java技能百练--游戏篇

    首先,Java语言在游戏开发中的优势在于其跨平台兼容性,Java的"一次编写,到处运行"特性使得游戏可以在不同的操作系统上运行,这极大地扩大了潜在玩家群体。此外,Java拥有丰富的库和框架,如LWJGL(Lightweight ...

    Java-核心篇.zip

    "Java-核心篇.zip"这个压缩包文件聚焦于Java多线程编程的核心概念,是Java学习者和开发者进阶的重要资料。其内容包括了Java实战经验与技术书籍的精华,旨在帮助读者深入理解并熟练掌握Java多线程编程。 Java多线程...

    java进阶/JDK 7、8新特性

    本篇主要关注JDK 7和8两个重要版本的新特性。 首先,JDK 7,是Java发展历程中的一个重要里程碑,它在2011年发布,引入了多项显著的改进。其中最重要的特性之一是“Try-with-resources”语句,这使得资源管理变得...

    java高级特性 - io流.pdf

    Java IO流是Java编程中处理输入输出流的高级特性,其目的是为了提供一个统一的方式来处理不同类型的数据,如文本文件、二进制文件等。Java的IO流是设计来实现数据传输的,主要使用java.io包下的各种类和接口。本篇...

    java程序员必读--基础篇

    I/O流是处理输入输出的关键,Java提供了丰富的流类库,如FileInputStream和FileOutputStream用于文件操作,BufferedReader和PrintWriter用于字符流处理,网络编程中的Socket和ServerSocket则用于网络数据交换。...

Global site tag (gtag.js) - Google Analytics