`
AsWater
  • 浏览: 24681 次
  • 性别: 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虚拟机特性JAVA SE 7.pdf-中文完整书签文字版

    ### Java虚拟机(JVM)特性JAVA SE 7 #### 概述 《Java虚拟机特性JAVA SE 7.pdf》是一本详细介绍Java虚拟机(JVM)规范的书籍,针对Java SE 7版本。本书由Tim Lindholm、Frank Yellin、Gilad Bracha和Alex Buckley共同...

    Java虚拟机规范(Java SE 7)-完整目录书签文字版

    Java SE 7(Java Standard Edition 7)是Java发展的一个重要版本,引入了许多新特性和改进,使得开发者能够编写更高效、更可靠的代码。在《Java虚拟机规范(Java SE 7)》中,详细阐述了JVM的工作原理、内存模型、类...

    The Java Language Specification, Java SE 7 Edition.rar

    通过阅读《Java语言规范,Java SE 7版》,开发者不仅可以了解上述特性的详细实现,还能深入理解Java内存模型、线程管理、异常处理等核心概念。这份文档是每个Java开发者案头必备的参考资料,对于提升编程技能和解决...

    Java虚拟机规范(Java SE 7 中文版

    Java SE 7(Java Standard Edition 7)是Java语言的一个重要版本,引入了许多新特性和改进,使得开发更加高效和灵活。下面将详细讨论Java虚拟机规范在Java SE 7中的主要内容和相关知识点。 1. 类加载机制:JVM负责...

    Java虚拟机规范(Java SE 7).pdf

    《Java虚拟机规范(Java SE 7)》不仅是Java虚拟机的基础理论指南,也是深入理解Java语言特性的关键参考资料。通过学习这本书,开发者不仅可以了解到Java虚拟机的工作原理,还能掌握如何利用这些知识来优化自己的...

    Beginning Java SE 6 Platform

    最后,本书还提供了一些关于Java SE 7的新特性和改进的预览,为读者提供了未来版本的方向和发展趋势。 总之,《Beginning Java SE 6 Platform》是一本全面覆盖Java SE 6平台各个方面的重要参考书籍,无论是对于初学...

    java资料---Java SE.ppt

    Java SE 6还引入了更多的API和改进,Java SE 7则引入了如try-with-resources语句、钻石操作符等新特性。 在Java的面向对象基础中,封装、继承和多态是三大核心概念。封装允许隐藏内部实现细节,提高代码安全性;...

    OCA Java SE7 Programmer I认证学习指南(Exam 1Z0-803).rar

    Java SE 7引入了许多新功能和改进,包括: 1. 多 catch 语句:在处理异常时,可以使用一个catch块同时捕获多种类型的异常,提高了代码的简洁性。 2. 针对try-catch-finally的改进:try块可以包含多个资源,这些资源...

    Java虚拟机规范(Java_SE_7).pdf

    ### Java虚拟机规范(Java SE 7)关键知识点解析 #### 一、概述 《Java虚拟机规范(Java SE 7版)》是一份详细介绍了Java虚拟机(JVM)架构和运行机制的重要文档。这份规范不仅是Java开发人员深入了解Java语言特性的...

    Java se编程指南

    8. **Java SE 6.0的新特性**:在Java SE 6.0版本中,有一些重要的改进和新特性,如增强的for循环(foreach)、可变参数(varargs)、自动装箱和拆箱,以及枚举类型的引入等,这些都提升了Java的易用性和效率。...

    Java SE Development Kit 8u181

    1. **Lambda表达式**:这是Java 8最重要的新特性之一,它引入了函数式编程的概念,允许开发者使用简洁的语法处理集合数据,提高了代码的可读性和效率。 2. **方法引用和构造器引用**:与Lambda表达式紧密相关,它们...

    Java虚拟机规范中文版(JavaSE7).pdf

    Java虚拟机规范(Java SE 7版)是定义JVM行为的官方文档,确保所有Java平台的实现遵循相同的规则,以提供跨平台的兼容性和一致性。这份规范涵盖了虚拟机的结构、字节码编译、字节码文件格式、类加载机制以及虚拟机...

    java se学习资料(PPT完整)

    8. **第08讲 - 文件和I/O流**: 会讲解Java的文件操作,包括读写文件、目录操作,以及I/O流的基本概念,如字节流、字符流、缓冲流等。 9. **第09讲和第10讲 - Java网络编程**: 这两讲深入讲解Java的网络编程,包括套...

    java se学习教程

    这个"Java SE学习教程"涵盖了Java编程的基础以及面向对象的概念,旨在帮助开发者深入理解Java语言。 一、Java语言基础 Java是一种强类型、面向对象的编程语言,由Sun Microsystems(后被Oracle收购)开发。其主要...

    Java SE 7u45 文档合集(2-1) (demo,api,tutorial)---demo

    Java SE 7u45是Java Standard Edition 7 Update 45的简称,这是一个重要的Java开发平台版本,针对Java 7进行了更新和增强。这个文档合集提供了丰富的资源,包括API文档、教程以及示例代码,帮助开发者深入理解和使用...

    java se 课件

    8. **Java SE 8及更高版本的新特性**: - Lambda表达式:简化函数式编程,提供简洁的代码。 - Stream API:用于处理集合数据的新方式,支持并行流。 - 默认方法:接口中可以定义带有实现的方法。 - 接口私有方法...

Global site tag (gtag.js) - Google Analytics