说明
这篇文章会基于Path和Files这2个类来对文件进行操作,使用起来会比File类方便很多。Files当成工具类用就行了。
Path介绍
Path是一个接口,里面定义了许多操作路径的便捷方法。
获取Path是通过Paths类里面的get方法
Path path = Paths.get("a", "b", "c.txt");
这个方法会将我们传入的字符串通过路径分隔符连接起来,上面的path连接后的内容如下
a\b\c.txt
Path里面的方法大家根据需要进行使用即可,都很简单。基本包含了所有对路径的操作
读写文件
通过Files可以很轻松的进行文件的读写
Path path = Paths.get("a.txt");
// 获取文件的全部字节
byte[] bytes = Files.readAllBytes(path);
// 按行读取所有内容
List<String> lines = Files.readAllLines(path);
// 通过追加方式写入字节数组
Files.write(path, bytes, StandardOpenOption.APPEND);
// 将文本行写入文件。每一行都是一个字符序列,并按顺序写入文件,每一行以平台的行分隔符结束
Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
对于文件长度较大的文本或者是二进制文件,还是应当使用输入输出流的方式来进行,可以通过Files轻松的创建流
Path path = Paths.get("a.txt");
InputStream inputStream = Files.newInputStream(path, StandardOpenOption.APPEND);
OutputStream outputStream = Files.newOutputStream(path);
Writer writer = Files.newBufferedWriter(path, StandardOpenOption.APPEND);
Reader reader = Files.newBufferedReader(path);
我们在进行文件写的时候可以传入一个或多个OpenOption,选项如下
创建文件和目录
下面代码用于创建目录
Path path = Paths.get("a/b/c");
// 只能创建最后一级目录,也就是除了最后一个文件夹外,其他文件夹都要存在
Path directory = Files.createDirectory(path);
// 创建多级目录
Path directories = Files.createDirectories(path);
下面代码用于创建文件
Path path = Paths.get("b.txt");
// 创建文件,如果存在就抛出异常
Path file = Files.createFile(path);
复制、移动和删除文件
复制文件
Path path1 = Paths.get("a.txt");
Path path2 = Paths.get("b.txt");
// 将a.txt复制到path2所在的目录下,新文件名称为b.txt
Path copy = Files.copy(path1, path2);
移动文件
Path path1 = Paths.get("a.txt");
Path path2 = Paths.get("move_a.txt");
// 将a.txt移动到path2所在的目录下,新文件名称为move_a.txt
Path move = Files.move(path1, path2);
删除文件
Path path = Paths.get("a.txt");
// 删除文件,不存在抛出异常
Files.delete(path);
// 如果存在该文件就删除
Files.deleteIfExists(path);
对于复制和移动方法,我们还可以传入一个或多个CopyOption,就是表示我们以何种方式来操作文件。下面给出了CopyOption的选项和解释
获取文件信息
下面的静态方法都将返回一个boolean值,表示检查路径的某个属性的结果:
- exists
- isHidden
- isReadable,isWritable,isExecutable
- isRegularFile,isDirectory,isSymbolicLink
size方法将返回文件的字节数:
long fileSize = Files.size(path);
getOwner方法将文件的拥有者作为java.nio.file,attribute,UserPrincipal的一个实例返回。所有的文件系统都会报告一个基本属性集,它们被封装在BasicFileAttributes接口中,这些属性与上述信息有部分重叠。基本文件属性包括:
- 创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都表示成java.nio.file.attribute.FileTime。
- 文件是常规文件、目录还是符号链接,抑或这三者都不是。
- 文件尺寸。
- 文件主键,这是某种类的对象,具体所属类与文件系统相关,有可能是文件的唯一标
识符,也可能不是。
获取这些属性可以通过下列调用
Path path = Paths.get("a.txt");
BasicFileAttributes basicFileAttributes = Files.readAttributes(path, BasicFileAttributes.class);
// 如果文件相同兼容POSIX,可以获取PosixFileAttributes实例
PosixFileAttributes posixFileAttributes = Files.readAttributes(path, PosixFileAttributes.class);
BasicFileAttributes 支持的方法如下
PosixFileAttributes支持的方法如下
我们在获取属性的时候还可以传入LinkOption选项,该选项的内容如下
访问目录中的项
现在有以下的目录结构
使用Files.list可以访问第一层子目录
Path path = Paths.get("a/");
try (Stream<Path> pathStream = Files.list(path)) {
pathStream.forEach(System.out::println);
}
输出为
a\b
a\b1
如果想要访问所有子目录,使用Files.walk
Path path = Paths.get("a/");
try (Stream<Path> pathStream = Files.walk(path)) {
pathStream.forEach(System.out::println);
}
输出如下
a
a\b
a\b\c
a\b1
a\b1\c1
可以发现访问方式是dfs,也就是深搜。
在walk函数中还可以传入FileVisitOption,选项内容如下
总结
Files里面方便的方法还有很多,这里只说明了几个常用的方法,感兴趣可以直接再去看一下官网文档。