`

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

相关推荐

    JDK7新特性(完整篇)

    1.1 JDK7新特性&lt;一&gt;概述 . . . . . . . . . . . . . . 1.2 JDK7新特性&lt;二&gt; 语法 . . . . . . . . . . . . . 1.3 JDK7新特性&lt;三&gt; JDBC4.1 . . . . . . . . . . 1.4 JDK7新特性&lt;四&gt; NIO2.0 文件系统 . . . 1.5 JDK...

    Spring2.5的新特性

    &lt;br&gt;本文是探讨这些新特性的3篇系列文章中的第一篇。本文将主要关注于简化的配置和在Spring应用程序上下文(application context)核心新增的基于注解的功能;第二篇文章将涵盖web层可用的新特性;最后一篇文章...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 编辑推荐 Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,...

    java语言快速入门习题与答案

    Java源程序(扩展名为.java)被Java编译器编译成Java字节码文件,这种字节码文件有专门的开发规范要求,它是一种结构独立的中间文件格式,字节码里面并没有保存跟特定平台相关的信息,这就是字节码的平台无关性。...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 其他详细信息查看:http://www.china-pub.com/196571 编辑推荐 Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的角度,...

    Java技术教程.基础篇part1

    共计十七章,前十章主要介绍了Java 2基本语法概念和面向对象的编程思想,其中包括运算符、流程控制、数组、字符串处理、异常、I/O及文件操作、对象的串行化以及面向对象的特性。后面七章从多方面介绍了Java 2编程...

    基于JAVA的RSA文件加密软件的设计与实现(源代码+论文).rar

    它包含了完整的Java源代码以及一篇详细的论文,旨在帮助用户深入理解并实践RSA加密算法在文件加密领域的应用。该源码是基于Java语言开发的,利用了Java平台的安全和网络特性,实现了一个简单而强大的RSA文件加密工具...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

    Java技术教程.基础篇

    第五章 java语言中的面向对象特性 第六章 数组 第七章 字符串处理 第八章 异常处理 第九章 java输入、输出及文件操作 第十章 对象串行化 第十一章 线程 第十二章 图形用户界面 第十三章 用Swing创建用户界面 第十四...

    JAVA程序设计与问题解决(高级篇).rar )

    本书使用了J2SE 5.0的最新特性,并且包含新的、可选讲的图形编程内容和贯穿全书的GUI材料。 本书可作为高等院校计算机及相关专业本科生或研究生程序设计课程的教材,也适合相关技术人员作为技术提高之用。

    Visual C++实践与提高-COM和COM+篇『PDF』

    因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的...

    Java典型模块

    第3章 Java新特性 3.1 Java的一些简单新特性 3.1.1 静态导入 3.1.2 可变参数函数 3.1.3 增强版for循环 3.1.4 基本数据的拆、装箱操作(autoboxing和unboxing) 3.2 枚举 3.2.1 枚举的实现原理 3.2.2 枚举的简单应用 ...

    学通Java的24堂课

    2.10.3 情景应用3——编写一个信息提示窗体 51 2.10.4 情景应用4——控制窗体位置 52 2.10.5 情景应用5——编写ui界面的加法 计算器 54 2.11 自我测试 55 2.12 行动指南 56 2.13 成功可以复制——迅雷创始人...

    JAVA在SQLite嵌入式数据库中的应用.rar

    SQLite 作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机、PDA、机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运行的很好。这篇文章介绍嵌入式数据库产品SQLite...

    Java JNI完全手册

     JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。  JAVA通过JNI调用本地方法,而本地方法是以...

    Java开源的下一代社区平台Symphony.zip

    打赏区编辑器同样支持 Markdown、Emoji 和文件上传等特性。打赏区支持内容更新,并可以随时调整打赏积分值。 对于测试帖,可以使用 Sandbox 机制:带有 Sandbox 标签的帖子将视为测试帖,不会显示在首页或是某领域...

Global site tag (gtag.js) - Google Analytics