简介

Files类是java.nio.file包的另一个主要入口点。该类提供了一组丰富的静态方法,用于读取,写入和操作文件和目录。Files方法适用于Path对象的实例。在进行其余部分之前,您应该熟悉以下常见概念:释放系统资源、捕捉异常、可变参数、原子操作、方法链、什么是Glob

释放系统资源

此API中使用的许多资源(如流或通道)实现或扩展了java.io.Closeable接口。关闭资源的要求是必须调用close方法以在不再需要时释放资源。忽略关闭资源可能会对应用程序的性能产生负面影响。下一节中描述的try-with-resources语句为您处理此步骤。

捕捉异常

使用文件I / O,一个很现实很常见的意外是:当一个文件被期待时,它存在(或不存在),该程序无法访问该文件系统,默认文件系统实现不支持特定功能,等等。可能会遇到许多错误。

访问文件系统的所有方法都可能会导致IOException异常。最好的做法是通过将这些方法嵌入到Java SE 7版本中引入的try-with-resources语句中来捕获这些异常。try-with-resources语句的优点在于,当不再需要时,编译器会自动生成代码以关闭资源。以下代码显示了如何显示:

Charset charset = Charset.forName("US-ASCII");
String s = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
writer.write(s, 0, s.length());
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
}

或者,您可以将文件I / O方法嵌入到try块中,然后捕获catch块中的任何异常。如果你的代码打开了任何流或通道,你应该在一个finally块中关闭它们。前面的例子看起来像以下使用try-catch-finally方法:

Charset charset = Charset.forName("US-ASCII");
String s = ...;
BufferedWriter writer = null;
try {
writer = Files.newBufferedWriter(file, charset);
writer.write(s, 0, s.length());
} catch (IOException x) {
System.err.format("IOException: %s%n", x);
} finally {
if (writer != null) writer.close();
}

除了IOException之外,很多具体的异常扩展了FileSystemException。这个类有一些有用的方法返回涉及的文件(getFile),详细的消息字符串(getMessage)文件系统操作失败(getReason)和“其他”文件涉及的原因(如果有的话)(getOtherFile)

以下代码片段显示了如何使用getFile方法

try (...) {
...
} catch (NoSuchFileException x) {
System.err.format("%s does not exist\n", x.getFile());
}

为了清楚起见,本课程中的文件I / O示例可能不会显示异常处理,但是您的代码应该始终包含它

可变参数

当指定标志时,几个Files方法接受任意数量的参数。例如,在以下方法签名中,CopyOption参数之后的椭圆符号表示该方法接受可变数量的参数或变量,因为它们通常称为:

Path Files.move(Path, Path, CopyOption...)

就像move的例子,可以向下面一样被调用:

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

Path source = ...;
Path target = ...;
Files.move(source,
target,
REPLACE_EXISTING,
ATOMIC_MOVE);

原子操作

几个Files方法,比如move,在一些文件系统中可以进行原子操作

一个原子操作的含义是:操作不能被中断或者部分执行。 不管是进入操作失败还是其他操作失败,当您有多个进程在文件系统的相同区域运行时,这很重要,您需要确保每个进程访问完整的文件。

方法链

很多文件IO方法都支持方法链的概念

你可以首先调用一个方法返回一个对象,然后立刻在这个对象上调用另外一个方法,然后返回另一个操作对象,以此类推。很多IO例子使用下面的技术:

String value = Charset.defaultCharset().decode(buf).toString();
UserPrincipal group =
file.getFileSystem().getUserPrincipalLookupService().
lookupPrincipalByName("me");

这个技术提供了一段紧凑的代码,使你可以避免声明你不需要的临时变量

什么是 Glob?

在File类中,有两个方法支持接收全局参数,但是,什么是全局?

您可以使用glob语法指定模式匹配行为

glob模式被指定为字符串,并与其他字符串匹配,例如目录或文件名。 Glob语法遵循几个简单的规则:

1,一个星号*匹配任意数量的字符(包括无)。

2,两个星号**,像*一样工作,但跨越目录边界。这种语法通常用于匹配完整的路径。

3,问号,匹配一个字符。

4,大括号指定子模式的集合。例如: {太阳,​​月亮,星星}匹配“太阳”,“月亮”或“星星”。 {temp *,tmp *}匹配以“temp”或“tmp”开头的所有字符串。

5,方括号传送一组单个字符,或者使用连字符( - )时,会显示一系列字符。例如: [aeiou]匹配任何小写的元音。 [0-9]匹配任何数字。 [A-Z]匹配任何大写字母。 [a-z,A-Z]匹配任何大写或小写字母。 在方括号内,*,?和\匹配自己。 所有其他角色都与自己匹配

6,要匹配*,?或其他特殊字符,您可以使用反斜杠字符\来将其转义。例如:\\匹配单个反斜杠,\?匹配问号。

以下是glob语法的一些示例:

* .html - 匹配以.html结尾的所有字符串

??? - 匹配三个字母或数字的所有字符串

* [0-9] * - 匹配包含数值的所有字符串

* {htm,html,pdf} - 匹配以.htm,.html或.pdf结尾的任何字符串

a?*。java - 匹配以a开头的任何字符串,后跟至少一个字母或数字,以.java结尾

{foo *,* [0-9] *} - 匹配以foo开头的任何字符串或包含数值的任何字符串

注意:如果您在键盘上键入glob模式,并且包含其中一个特殊字符,则必须将模式置于引号(“*”)中,使用反斜杠(\ *),或使用任何支持的转义机制命令行。

glob语法功能强大且易于使用。但是,如果您的需求不足,您还可以使用正则表达式。有关更多信息,请参阅正则表达式课程。 有关glob sytnax的更多信息,请参阅FileSystem类中的getPathMatcher方法的API规范。

File IO(NIO.2):文件操作的更多相关文章

  1. java IO流 Zip文件操作

    一.简介 压缩流操作主要的三个类 ZipOutputStream.ZipFile.ZipInputStream ,经常可以看到各种压缩文件:zip.jar.GZ格式的压缩文件 二.ZipEntry   ...

  2. java IO流 对文件操作的代码集合

    Io流 按照分类 有两种分类 流向方向: 有输入流和输出流 按照操作类型有:字节流和字符流 按照流向方向 字节流的一些操作 //读文件 FileInputStream fis = new FileIn ...

  3. [IO] C# FileOperateHelper文件操作类与源码下载

    主要功能如下所示 源码预览 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url]ht ...

  4. java io流 对文件操作

    检查文件是否存在 获取文件路径 获取文件大小 ...... 更多参考手册 //对文件的操作 //检查文件是否存在 //获取文件路径 //获取文件大小 //文件是否可读 //文件是否可写 //.... ...

  5. 第9.10节 Python中IO模块其他文件操作属性和方法简介

    本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...

  6. C#文件操作 File(静态类)

      操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 1 2 3 4 5 6 7 8 9 //使用file的静态方法进行复制             File.C ...

  7. C#中的文件操作1

    1. 文件操作常用相关类 a)File             //操作文件,静态类,对文件整体操作.拷贝.删除.剪切等. b)Directory       //操作目录(文件夹),静态类 c)Di ...

  8. 第九章 Python文件操作

    前一阵子写类相关的内容,把老猿写得心都累了,本来准备继续介绍一些类相关的知识的,如闭包.装饰器.描述符.枚举类.异常等,现在实在不想继续,以后再开章节吧.本章弄点开胃的小菜提提神,介绍Python中文 ...

  9. Python复习笔记-字典和文件操作

    抽时间回顾2年前自己做过的python工具,突然感觉不像自己写的,看来好久没用过python的字典和文件操作了,查询资料和网页,整理如下: 一.字典 键值对的集合(map) 字典是以大括号“{}”包围 ...

  10. shutil 高级文件操作

    High-level file operations  高级的文件操作模块,官网:https://docs.python.org/2/library/shutil.html# os模块提供了对目录或者 ...

随机推荐

  1. java Vamei快速教程21 事件响应

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在GUI中,我们看到了如何用图形树来组织一个图形界面.然而,这样的图形界面是静态的 ...

  2. JS中的toString()和valueOf()方法

    1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...

  3. java 字符串中是否有数字

    http://www.cnblogs.com/zhangj95/p/4198822.html http://www.cnblogs.com/sunzn/archive/2013/07/12/31865 ...

  4. React后台管理系统-ajax请求封装

    1.新建文件夹 util , 在util里边新建 mm.jsx文件 2.使用jquery里边的ajax发送请求,回调用promise,返回一个promise对象 request(param){     ...

  5. swl字符串

    创建字符串方法 去掉时间戳 #define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT ...

  6. Vimim是VI中最好的输入法

    Vimim是VI中最好的输入法 由于在VI中,normal和insert模式的存在,如果在insert模式下正在输入中文,在通过ESC键返回到normal模式后,系统的中文输入法会与VI的命令相冲突, ...

  7. oracle 多行数据合并一行数据

    在工作中遇见的oracle知识,多行合并成一行,记录一下 1.取出需要的数据,代码: (SELECT to_char(m.f_meetdate, 'yyyy-MM-dd'), decode(nvl(m ...

  8. dom 添加删除节点

    //找到 div1 var div1 = document.getElementById("div1"); //创建 一个 p标签 var p = document.createE ...

  9. 二十七、MySQL 复制表

    MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT 命令,是无法实现的. 本章节将为大家介绍如何完 ...

  10. 十六、MySQL LIKE 子句

    MySQL LIKE 子句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以 ...