`
AsWater
  • 浏览: 24147 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java SE 7 新特性之文件操作(3)- 相关的一些概念

阅读更多

转自开发者的天空

 

Path类提供了很多方法来对文件和目录进行读、写和其他的操作。在看这些方法之前,我们先需要了解一些其他的概念:
Varargs
Varargs实际上是Variable number of arguments的缩写,也就是可变数目的参数。例如在下面的方法声明中,CopyOption参数后面的省略号表明这个方法接受可变个数的参数。
        Path moveTo(Path, CopyOption...)
当一个方法可以接受可变数目的参数时,你可以传入以逗号分隔的多个参数,或者传入一个数组。
对于上面的moveTo方法,可以这样调用:

import static java.nio.file.StandardCopyOption.*;

        Path orig = ...;
        Path new = ...;
        orig.moveTo(new, REPLACE_EXISTING, ATOMIC_MOVE);
 

 

原子操作
Path的很多方法在文件系统上执行的操作都是原子操作,例如moveTo方法。原子操作是指不会被中断或不会部分执行的操作。操作要么是完全成功,要么是完全失败。当有多个进程操作同文件系统的相同的区域的时候这一点就很重要。

方法链
很多的文件I/O方法支持方法链的概念。
调用第一个方法会返回一个对象,我们可以直接调用这个对象的方法,这个方法依然返回一个对象,我们又可以直接调用该对象的方法,就这样持续下去。例如:
        String value = Charset.defaultCharset().decode(buf).toString();
        UserPrincipal group = file.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("me");
这个技术能够使我们编写更加紧凑的代码,避免声明一些我们不需要的临时变量。

FileRef接口
Path类实现了FileRef接口。FileRef接口包含了定位文件和访问文件的方法。

参数中的模式匹配
Path类有两个方法能够接受带模式匹配的参数。下面是这种参数的规则:
星号*匹配任意数目的字符(也可能是没有)
两个星号**同样是代表任意数目的字符,不同的是这个匹配可以穿越目录边界。例如 c:\a**\bar可以匹配c:\abc\bar,也可以匹配c:\am\cn\bar。
问号?匹配一个字符
花括号{}表明子模式的集合,例如{sun,moon,stars}可以匹配'sun','moon'或‘stars’;{temp*,tmp*}可以匹配以temp或tmp开始的任意字符串。
要匹配*,?或其他的特殊字符,可以使用转义符\。例如\\匹配单个的\,\?匹配问号。
方括号[]表示一组单独的字符,当使用了-的时候,也代表一个范围的字符,例如:
[aeiou]匹配任何单独的元音字符,[0-9]匹配任意数字,[A-Z]匹配任意大写字母,[a-z,A-Z]匹配任意大写或小写字母。在方括号中,星号、问号和\都只是表示它们自身,不再作为特殊符号。
下面是一些例子:
*.html匹配所有以.html结尾的字符串。
???匹配所有长度为3的字符串
*[0-9]*匹配所有包含有数字的字符串
*.{html,htm,pdf}匹配所有以.html,.html或.pdf结尾的字符串
a?*.java匹配所有以a开头,后面跟至少一个字符,然后以.java结尾的字符串。
{foo*,*[0-9]*}匹配以foo开头的字符串或包含有数字的字符串。
关于参数中的模式的使用,请参考FileSystem类的getPathMatcher方法的帮助文档。
如果这种模式匹配仍然不能够满足需要,我们还可以使用正则表达式。


检查文件的可访问权限
Path会指向文件或者目录,但是我们还不能确定这个文件或者目录是否存在,是否可读,是否可写,是否可以执行。要确定文件/目录是否存在以及程序是否可以访问该文件/目录,可以使用checkAccess(AccessMode...)方法。可选的AccessMode有:
    * READ – 检查文件/目录是否存在以及程序是否有权限读该文件/目录
    * WRITE – 检查文件/目录是否存在以及程序是否有权限写该文件/目录
    * EXECUTE – 检查文件/目录是否存在以及程序在该文件/目录上是否有执行权限
如果调用checkAccess的时候没有传入任何参数,该方法只是检查文件是否存在。
下面的例子演示了怎样验证文件是否存在以及程序是否有读和执行的权限。

import static java.nio.file.AccessMode.*;
     
    Path file = ...;
    try {
        file.checkAccess(READ, EXECUTE);
    } catch (IOException x) {
        //Logic for error condition...
        return;
    }

    //Logic for executable file...
 

 

需要注意的是,当checkAccess执行完之后,文件的权限可能被其他的用户(例如系统管理员)修改。这实际上是很多应用程序都有的安全性的问题。如果你感兴趣,可以搜索TOCTTOU (time of check to time of use)。

检查两个Path是否是同一个文件/目录


当文件系统中存在符号链接的时候,可能两个不同的路径会指向同一个文件或目录。方法isSamePath会比较两个Path来检查它们是否指向同一个文件/目录。

Path p1 = ...;
    Path p2 = ...;

    try {
        if (p1.isSameFile(p2)) {
            //Logic when the paths locate the same file
        }
    } catch (IOException x) {
        //Logic for error condition...
        return;
    }
分享到:
评论
3 楼 AsWater 2010-04-01  
TheNewBeginning 写道
支不支持直接获得文件的创建时间?

Java SE 7提供了获取文件时间戳的方法,包括创建时间/最后编辑时间/最后访问时间
具体信息请见
http://www.developersky.net/thread-20-1-1.html
2 楼 TheNewBeginning 2010-03-31  
支不支持直接获得文件的创建时间?
1 楼 shuiguozheng 2010-03-30  
学习。。。。。。。

相关推荐

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

     《Java JDK 7学习笔记》针对Java SE 7新功能全面改版,无论是章节架构或范例程序代码,都做了全面重新编写与翻新。  《Java JDK 7学习笔记》是作者多年来教学实践的经验总结,汇集了学员在教学过程中遇到的概念、...

    Java SE实践教程 源代码 下载

    Java SE实践教程 源代码 2010-9-13 声明:在网上找了好久才找到这个源码,真不容易啊,请大家多多支持。 2010-9-13 内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...

    新版Android开发教程.rar

    己的格式,回避掉需要付给 SUN 有关 JAVA 的授权费用。 对手机制造者的影响 � Android 是款开源的移动计算软件平台,组建了 google 主导的拥有众多产业界巨头的产业联盟,有利于 高效开发、降低成本。 � 由于是源...

    Java核心技术 卷Ⅰ:基础知识 【中文】(第八版)

    熟悉 C++的程序员可以快速地浏览这一章,而没有面向对象程序设计背景的程序员,应在进一步学 习Java之前花一些时间了解OOP的有关概念。 第5章介绍类与封装仅仅是OOP中的一部分,本章将介绍另一部分—继承。继承使...

    Java核心技术.第9版.卷1.卷2.英文版

    第9版根据Java SE 7全面更新,同时修正了第8版中的不足,系统全面讲解Java语言的核心概念、语法、重要特性和开发方法。《Java核心技术·卷1:基础知识(原书第9版)》共14章。第1章概述了Java语言与其他程序设计语言...

    Java 虚拟机面试题全面解析(干货)

    Java 虚拟机面试题全面解析,《深入理解Java虚拟机》干货版,自己总结,希望能够帮助大家,免费下载~什么是类加载机制? 虚拟机和物理机的区别是什么? 运行时栈帧结构 Java方法调用 什么是方法调用? Java的方法调用,...

    JAVA Nio 学习探究

    包含NIO核心概念、基本文件读写、缓冲区内部实现机制、异步IO、缓冲区更多特性探究、文件锁与字符集

    Android程序设计基础

     本书最后提供了一个附录,其中列出了Android与Java SE(Java Standard Edition,Java标准版)之间的不同之处。 . 在线资源  本书网站http://pragprog.com/titles/eband提供了以下资源。  本书使用的所有示例...

    C++大学教程,一本适合初学者的入门教材(part1)

    1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的...

    informix 实用大全

    本书内容包括核心概念、Informix SQL、服务器管理、安装与维护、性能调整、应用程序开发、Web应用程序和对象关系式数据库等,所附光盘中有大量实用程序、白皮书和与书中内容有关的其他信息。还提供一些Web站点链接....

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    C++大学教程,一本适合初学者的入门教材(part2)

    1.9 Java、Internet与万维网 1.10 其他高级语言 1.11 结构化编程 1.12 典型C++环境基础 1.13 C++与本书的一般说明 1.14 C++编程简介 1.15 简单程序:打印一行文本 1.16 简单程序:两个整数相加 1.17 内存的...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

Global site tag (gtag.js) - Google Analytics