File IO(NIO.2):文件操作
简介
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):文件操作的更多相关文章
- java IO流 Zip文件操作
一.简介 压缩流操作主要的三个类 ZipOutputStream.ZipFile.ZipInputStream ,经常可以看到各种压缩文件:zip.jar.GZ格式的压缩文件 二.ZipEntry ...
- java IO流 对文件操作的代码集合
Io流 按照分类 有两种分类 流向方向: 有输入流和输出流 按照操作类型有:字节流和字符流 按照流向方向 字节流的一些操作 //读文件 FileInputStream fis = new FileIn ...
- [IO] C# FileOperateHelper文件操作类与源码下载
主要功能如下所示 源码预览 /// <summary> /// 类说明:Assistant /// 编 码 人:苏飞 /// 联系方式:361983679 /// 更新网站:[url]ht ...
- java io流 对文件操作
检查文件是否存在 获取文件路径 获取文件大小 ...... 更多参考手册 //对文件的操作 //检查文件是否存在 //获取文件路径 //获取文件大小 //文件是否可读 //文件是否可写 //.... ...
- 第9.10节 Python中IO模块其他文件操作属性和方法简介
本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...
- C#文件操作 File(静态类)
操作某一个文件/文件夹,需要一个文件的完整路径 一.使用File的静态方法进行文件操作 1 2 3 4 5 6 7 8 9 //使用file的静态方法进行复制 File.C ...
- C#中的文件操作1
1. 文件操作常用相关类 a)File //操作文件,静态类,对文件整体操作.拷贝.删除.剪切等. b)Directory //操作目录(文件夹),静态类 c)Di ...
- 第九章 Python文件操作
前一阵子写类相关的内容,把老猿写得心都累了,本来准备继续介绍一些类相关的知识的,如闭包.装饰器.描述符.枚举类.异常等,现在实在不想继续,以后再开章节吧.本章弄点开胃的小菜提提神,介绍Python中文 ...
- Python复习笔记-字典和文件操作
抽时间回顾2年前自己做过的python工具,突然感觉不像自己写的,看来好久没用过python的字典和文件操作了,查询资料和网页,整理如下: 一.字典 键值对的集合(map) 字典是以大括号“{}”包围 ...
- shutil 高级文件操作
High-level file operations 高级的文件操作模块,官网:https://docs.python.org/2/library/shutil.html# os模块提供了对目录或者 ...
随机推荐
- Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)
1.Apache -Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包 ...
- Flutter Json序列号和反序列化遇到问题 Missing "part 'xxx.g.dart';"
/** * * 1.@JsonSerializable() 这是表示告诉编译器这个类是需要生成Model类的 * 2,@JsonKey 由于服务器返回的部分数据名称在Dart语言中是不被允许的, * ...
- 使用OpenFileDialog组件打开对话框
实现效果: 知识运用: OpenFileDialog组件的ShowDialog方法 public DialogResult Show () //返回枚举值 DialogRrsult.OK 或 Di ...
- Problem I: Satellite Photographs
Problem I: Satellite Photographs Time Limit: 1 Sec Memory Limit: 128 MB Submit: 208 Solved: 118 [S ...
- AngularJS 对象
AngularJS对象就像JavaScript对象 <!DOCTYPE html><html><head><meta http-equiv="Con ...
- react的redux中间件
redux 的中间件(对dispatch功能的拦截和增强,一般不用自己写,有插件) dispath是一个方法,可以自行中间拦截更改: store.dispatch = function(action) ...
- cf492E. Vanya and Field(扩展欧几里得)
题意 $n \times n$的网格,有$m$个苹果树,选择一个点出发,每次增加一个偏移量$(dx, dy)$,最大化经过的苹果树的数量 Sol 上面那个互素一开始没看见,然后就GG了 很显然,若$n ...
- zabbix mysql 迁移 增加分区
1.zabbix mysql 目录清单 --basedir=/usr/local/web/mysql --datadir=/data/mysql --log-error=/data/mysql/sys ...
- Mysql--select基础查询
基本语法:select 查询列表 from 表名 查询列表可以是表中字段.常量值.表达式.函数:查询的结果是一个虚拟的表格. 注意: ①sql语言大小写不敏感 ②关键字不能分行或略写 ③一般书写方式为 ...
- 火狐IE event和target的兼容
一.event对象 IE 中可以直接使用 window.event 对象,而 FF 中则不可以,解决方法之一如下: var theEvent = window.event || arguments.c ...