Java SE 7 新特性之文件操作(3) - Path的其他操作和一些概念

转自 开发者的天空

 

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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值