`
developersky
  • 浏览: 7946 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java SE 7文件操作之可变参数与模式匹配参数

阅读更多
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;
}




转载自  开发者的天空
分享到:
评论

相关推荐

    Java数组传递及可变参数操作实例详解

    主要介绍了Java数组传递及可变参数操作,结合实例形式详细分析了java数组参数传递与可变参数相关使用技巧,需要的朋友可以参考下

    10.java可变参数.zip

    10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可变参数.zip10.java可...

    java版的AC多模式匹配算法

    AC 多模式匹配算法的实现可分预处理和搜索查找两个阶段。在预处理阶段根据待匹配的模式串组生成有限状态机;搜索查找阶段状态机根据输入的文本串进行状态跳转,当到达某一状态时,该状态有匹配的模式串,则匹配成功...

    Java虚拟机规范.Java SE 8版.zip

    《Java核心技术系列:Java虚拟机规范(Java SE 8版)》完整而准确地阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而...

    Java中的可变参数常见用法实例总结

    主要介绍了Java中的可变参数常见用法,结合实例形式总结分析了java可变参数的常见功能、使用方法及相关操作注意事项,需要的朋友可以参考下

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

    Java虚拟机规范(Java_SE_7)中文版,帮助很多爱好java虚拟机的同学深入学习java虚拟机

    Spring Quartz可变参数Trigger

    Spring整合Quartz,在运行的过程中动态改变Trigger的参数

    Java后端HttpClient Post提交文件流 及服务端接收文件流

    HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。

    Class文件转JAVA

    轻松方便的把class文件转化为java文件

    Java SE 8 API

    也可以自己去官网下载自己需要的API 下载的地址 http://www.oracle.com/technetwork/java/javase/documentation/jdk8-doc-downloads-2133158.html 选择 Accept License Agreement 就可以下载了

    java调用shell(包含有参数的调用)

    java调用shell 包含简单的编写shell文件 调用含有参数的shell文件

    java可变参数当做数组处理的方法示例

    主要介绍了java可变参数当做数组处理的方法,结合实例形式分析了java可变参数当做数组处理相关原理、步骤与操作注意事项,需要的朋友可以参考下

    java源码包---java 源码 大量 实例

     Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。  部分源代码摘录:  ftpClient = new FtpClient(); //实例化FtpClient对象  String serverAddr=jtfServer.getText(); //得到服务器地址  ...

    nc文件读写 java版本

    netcdf即nc文件的读写实例,java版本的,不懂的地方可以问我,lishirongtech@126.com

    Java JDK7学习笔记-光盘

    《Java JDK7学习笔记》针对java se 7新功能全面改版,无论是章节架构或范例程序代码,都做了重新编写与全面翻新。并详细介绍了jvm、jre、java se api、jdk与ide之间的对照关系。必要时从java se api的源代码分析,...

    java调用json参数的webservice

    java调用json参数的webservice 涉及技术: JAVA JSON WEBSERVICE

    wildcard:Java中高效的文件系统模式匹配

    通配符是一个小型Java库,可以执行文件和目录的有效模式匹配。 路径可以与通配符或正则表达式匹配。 匹配的文件可以轻松地复制,删除,压缩等。地球匹配glob方法使用文字字符和可选的通配符收集文件和目录: Paths ...

    OCP JAVA SE 6 PROGRAMMER认证试题解析.pdf

    OCP JAVA SE 6 PROGRAMMER认证试题解析.pdf

    Java(TM) Platform SE binary 7.70U I586完整版

    Java(TM) Platform SE binary 7.70U I586完整版,JAVA开发必备的SUN公司软件。

Global site tag (gtag.js) - Google Analytics