在对文件或目录进行操作之前,可以先调用 Files 类上的一系列 isXXX 方法来对文件或目录进行校验。对文件先进行校验再操作可以避免产生一些不必要的异常。例如,可以先校验文件是否存在,再做移动或删除的操作。或者先校验文件是否可读写,再对文件做读写操作。
检查文件或目录是否存在
无论真实文件系统中是否真的存在文件或目录,都可以创建Path 对象。某些时候,当不需要操作真实文件时,我们可以成功使用 Path 对象上的方法。但是有的操作,需要先判断文件是否真实存在。通过 Files 提供的下面两个方法可以方便地进行验证:
- exists() - 检查文件是否存在
- notExists() - 检查文件是否不存在
这两个方法都可以传入两个参数,第一个参数表示需要检验的 Path 对象,第二个参数表示如何处理符号链接。当文件存在时, exists() 方法返回 true,否则返回 false(当文件不存在或检验过程失败)。
下面的代码将检验 AEGON.txt 是否存在于 C:\rafaelnadal\tournaments\2009 目录下:
Path path = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2009","AEGON.txt");
…
boolean path_exists = Files.exists(path, new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
如果你需要检查文件是否不存在,那么可以调用 notExists() 方法,当文件不存在时,返回 true,否则返回 false (文件存在或检验过程失败)。
Path path = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2009",
"AEGON.txt");
…
boolean path_notexists = Files.notExists(path, new LinkOption[]{LinkOption.NOFOLLOW_LINKS});
注:如果两个方法同时检验一个 Path 对象,并且都返回 false,那么表示检验过程失败。例如,如果你对文件没有访问权限,那么两个方法都会返回 false,表示文件状态未知。因此,我们可以很容易的得到结论,文件的状态分别是:已存在、不存在和未知。如果这两个方法中其中一个返回 false,那么读取文件时有可能抛出 SecurityException 异常。
注意,!Files.exists(…) 与 Files.notExists(…) 的值有可能不同,这两个方法并不互补。
检查文件访问性
另外一个比较好的习惯是在对文件进行操作前先调用 isReadable()、
isWritable() 和 isExecutable() 方法检查文件的访问级别。当传入 Path 对象进行验证后,这些方法会返回验证结果:Path 可读(文件存在并且 JVM 有权限打开文件并读取),Path 可写(文件存在,并且 JVM 有权限打开文件写入),Path 可执行(文件存在,并且 JVM 有权限执行文件)。
另外,还可以调用 isRegularFile() 来检验 Path 对象是否为普通文件。普通文件是指文件没有特殊的属性(不是符号链接也不是目录等)、并且文件存放了真实的数据。例如文本文件或普通二进制文件就是普通文件。isReadable()、isWritable()、isExecutable()、和
isRegularFile() 方法都返回 boolean 值:ture 分别表示文件可读、可写、可执行、是普通文件。false 分别表示文件不可读、不可写、不可执行、不是普通文件、或 JVM 没有访问权限。
下面的代码将这几个方法融合在一起,检验 C:\rafaelnadal\tournaments\2009 目录下的 AEGON.txt 文件:
Path path = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2009","AEGON.txt");
boolean is_readable = Files.isReadable(path);
boolean is_writable = Files.isWritable(path);
boolean is_executable = Files.isExecutable(path);
boolean is_regular = Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS);
if ((is_readable) && (is_writable) && (is_executable) && (is_regular)) {
System.out.println("The checked file is accessible!");
} else {
System.out.println("The checked file is not accessible!");
}
或者,你可以使用下面的简短版本:
boolean is_accessible = Files.isRegularFile(path) & Files.isReadable(path) &
Files.isExecutable(path) & Files.isWritable(path);
if (is_accessible) {
System.out.println("The checked file is accessible!");
} else {
System.out.println("The checked file is not accessible!");
}
注意:即使对文件进行了访问性判断,也不能完全保证文件能有效访问。这是一个非常出名的软件 bug,叫做 time-of-check-to-time-of-use(TOCTTOU,读作 “TOCK too”),意思是说对文件进行校验完成后,在使用文件之前,文件状态已经发生了改变。Unix 用户可能对这个概念比较熟悉,但是它会发生在任何系统上。
检验两个 Path 对象是否指向同一文件
调用 isSameFile() 方法可以检验两个 Path 对象是否指向同一文件。例如,在分别使用相对路径和绝对路径定义 Path 对象时,Path 对象是否指向同一文件不是很明显,这时就可以使用 isSameFile() 方法进行判断。下面的代码使用了三种方式来定义 MutuaMadridOpen.txt 文件,并使用 isSameFile() 来判断是否指向同一文件:
Path path_1 = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2009",
"MutuaMadridOpen.txt");
Path path_2 = FileSystems.getDefault().getPath("/rafaelnadal/tournaments/2009",
"MutuaMadridOpen.txt");
Path path_3 = FileSystems.getDefault().getPath("/rafaelnadal/tournaments/dummy/../2009",
"MutuaMadridOpen.txt");
try {
boolean is_same_file_12 = Files.isSameFile(path_1, path_2);
boolean is_same_file_13 = Files.isSameFile(path_1, path_3);
boolean is_same_file_23 = Files.isSameFile(path_2, path_3);
System.out.println("is same file 1&2 ? " + is_same_file_12);
System.out.println("is same file 1&3 ? " + is_same_file_13);
System.out.println("is same file 2&3 ? " + is_same_file_23);
} catch (IOException e) {
System.err.println(e);
}
输出结果为:
is same file 1&2 ? true
is same file 1&3 ? true
is same file 2&3 ? true
检查文件可见性
如果你需要知道文件是否隐藏,那么可以调用 Files.isHidden() 方法。记住,“隐藏文件”的概念在各个系统上各不相同,你只需要调用这个方法并判断返回值。下面的代码将检查 MutuaMadridOpen.txt 文件是否是隐藏文件:
Path path = FileSystems.getDefault().getPath("C:/rafaelnadal/tournaments/2009",
"MutuaMadridOpen.txt");
…
try {
boolean is_hidden = Files.isHidden(path);
System.out.println("Is hidden ? " + is_hidden);
} catch (IOException e) {
System.err.println(e);
}
文章来源:
http://www.aptusource.org/2014/04/nio-2-checking-files-and-directories/
分享到:
相关推荐
Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...
New I/O (NIO), and NIO.2 categories. You learn what each category offers in terms of its capabilities, and you also learn about concepts such as paths and Direct Memory Access. Chapters 2 through 5 ...
这是一本介绍java io以及nio相关知识的书,书中对知识的讲解通俗易懂,是学习java nio以及复习java io相关知识的必备书籍。注意:本书为英文版!!!
java nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava nio.pdfjava ...
Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf Java NIO.pdf
蔚来-NIO.US-新车上市,蔚来可期.pdf
Apress.Pro.Java.7.NIO.2.2011
This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...
Pro Java 7 NIO.2 – PDF Books
Java NIO,Ron Hitchens 著,中文版 裴小星 译,Pro Java 7 NIO.2,Anghel Leonard 著,pdf文字版带书签,无安全限制
java NIO.zip
Pro Java 7 NIO.2.pdf,2011 by Anghel Leonard
在早期的 Java 版本中,文件 IO 操作功能一直相对较弱,主要存在以下问题: 缺乏对现代文件系统的支持:只提供的基础的文件操作,不支持很多现代的文件系统 API 不够直观:文件操作的 API 设计相对较为复杂和冗长,...
下面小编就为大家分享一篇JDK1.7 之java.nio.file.Files 读取文件仅需一行代码实现,具有很好的参考价值,希望对大家有所帮助
This book covers all the important aspects involved in developing NIO.2-based applications. It provides clear instructions for getting the most out of NIO.2 and offers many exercises and case studies ...
JavaNIO.pdf
用java.nio.*进行网络编程
找了好久,终于找到了,java刷新同步获取网络资源
NIO.2插座测试仪 一个演示应用程序,用于检查是否可以使用在TCP套接字的另一端读取所有成功的写入。 建造 仅通过从命令行运行ant即可在NetBeans中构建NetBeans ant项目: ant 跑步 在dist文件夹中创建的jar文件包含...