目录
13.5 引言
java.nio.files类是一个功能非常强大的类。该类定义了大量的静态方法用来读、写和操纵文件与目录。Files类主要操作Path对象
13.5.1 创建和删除目录及文件
Files类提供了下面的方法创建、删除目录及文件
1.public static Path createDirectory(Path dir,FileAttribute<?>...attrs):创建由dir指定的目录,参数attrs指定目录的属性,如果不需要设置属性,可忽略该参数。如果创建的目录已经存在,该方法将抛出FileAlreadyExistsException异常
2.public static Path createFile(Path file,FileAttribute<?>...attrs):创建由file指定的文件。如果文件的父目录不存在,该方法会抛出一个IOException异常。如果存在一个同名的文件,将抛出FileAlreadyExistsException异常
3.public static void delete(Path path):删除由path指定的目录或文件。如果path是一个目录,要求目录必须为空,如果path不存在,将会抛出NoSuchFileException异常
4.public static void deleteIfExists(Path path):如果path对象存在则将其删除。如果path是目录,要求目录必须为空,如果不为空则抛出DirectoryNotEmptyException异常
delete(Path)和deleteIfExists(Path)方法的区别
- delete(Path)删除文件,如果删除失败将抛出异常。例如:如果文件不存在将抛出NoSuchFileException异常,可以捕获有关异常确定删除文件失败的原因
- deleteIfExists(Path)也可删除文件,但如果文件不存在将不抛出异常。这个特性在多线程删除文件、又不想抛出异常时特别有用,因为可能一个线程先执行了删除s
13.5.2 文件属性操作
可以使用Files类的方法检查Path对象表示的文件或目录是否存在,是否可读,是否可写,是否可执行等。
1.public static boolean exists(Path path,LinkOption...options):检查path所指的文件或目录是否存在。
2.public static boolean notExists(Path path,LinkOption...options):检查path所指的文件或目录是否不存在。注意,!Files.exists(path)和Files.notExists(path)并不等价。如果exists(path)与notExists (path)都返回false,说明文件不能检验
3.public static boolean isReadable(Path path):检查path所指的文件或目录是否可读
4.public static boolean isWritable(Path path):检查path所指的文件或目录是否可写
5.public static boolean isExecutable(Path path):检查path所指的文件或目录是否可执行
6.static boolean isRegularFile(Path path):如果指定的path对象是一个文件返回true
下面代码检验一个文件是否存在,是否可执行
Path file=Paths.get("D:\\study\data.ser");
boolean isRegular=Files.isRegularFile(file) & Files.isReadable(file)
& Files.isExecutable(file);
Files类中包含了下面一些获得或设置文件一个属性的方法
1.static long size(Path path):返回指定文件的字节大小
2.static boolean isDirectory(Path path,LinkOption...options):如果指定的Path对象是一个目录就返回true
3.static boolean isHidden(Path path):如果指定的Path对象是隐藏的返回true
4.static FileTime getLastModifiedTime(Path path,LinkOption...options):返回指定文件的最后修改时间
5.static Path setLastModifiedTime(Path path,FIleTime):设置指定文件的最后修改时间
6.static Path setOwner(Path path,UserPrincipal):设置指定文件的所有者
7.static Object getAttribute(Path path,String,LinkOption...options):设置用字符串指定文件的属性
8.static Path setAttribute(Path path,String,Object obj,LinkOption...options):设置用字符串指定文件的属性
注意:当要删除路径时,由于路径不空所以发生异常。可以先删除目录中的文件,再删除目录
13.5.3 文件和目录的复制与移动
使用Files类的copy()方法可以复制文件和目录。使用move()方式可以移动目录和文件copy()方法的一般格式为:
public static Path copy(Path source,Path target,CopyOption...)
source为源文件:target为目标文件:可选的参数options为CopyOption接口对象,是java.nio.file包的一个接口。StandardCopyOption枚举是CopyOption接口的一个实现,提供了下面三个复制选项
1.ATOMIC_MOVE:将移动文件作为一个原子的文件系统操作
2.COPY_ATTIBUTES:将属性复制到新文件中
3.REPLACE_EXISTING:如果文件存在,将它替换
在复制文件时,如果源文件不存在,将产生NoSuchFileException异常。如果目标文件存在,将产生FileAlreadyExistsException异常。
如果要覆盖目标文件,应指定REPLACE_EXISTING选项。
目录也可以复制,但目录中的文件不能复制,也就是即使原来目录中包含文件,新目录也是空的。
除了复制文件外,Files类还定义了在文件和流之间复制的方法
1.public static long copy(InputStream in,Path target,CopyOption...options):从输入流中将所有字节复制到目标文件中。
2.public static long copy(Path source,OutputStream out):将源文件中的所有字节复制到输出流中
使用move方法可以移动或重命名文件和目录,格式如下:
public static Path move(Path source,Path target,CopyOption...options)
如果目标文件存在,移动将失败,除非制定了REPLACE_EXISTING选项。空目录也可以被移动