Files工具类
# 前言
从Java 7开始,提供了Files
和Paths
这两个工具类,能极大地方便我们读写文件。
在了解这两个工具类之前,我们先了解一下nio。nio是新的IO API,它是非阻塞的,原先之前我们学的IO都是阻塞的,后面网络编程就会体现出来。
# NIO概述
Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
java.nio.channels.Channel
- |-----FileChannel:处理本地文件
- |-----SocketChannel:TCP网络编程的客户端的Channel
- |-----ServerSocketChannel:TCP网络编程的服务器端的Channel
|-----DatagramChannel:UDP网络编程中发送端和接收端的Channel
io都是基于流实现的,而nio都是基于Channel实现的。
# NIO.2
随着JDK 7 的发布,Java对NIO进行了极大的扩展,增强了对文件处理和文件系统特性的支持,以至于我们称他们为NIO.2。因为NIO 提供的一些功能,NIO已经成为文件处理中越来越重要的部分。
早期的Java只提供了一个File类来访问文件系统,但File类的功能比较有限,所提供的方法性能也不高。而且,大多数方法在出错时仅返回失败,并不会提供异常信息。
NIO. 2为了弥补这种不足,引入了Path接口
,代表一个平台无关的平台路径,描述了目录结构中文件的位置。Path可以看成是File类的升级版本,实际引用的资源也可以不存在。
- 以前的IO操作都是这样写的:
File file = new File("index.html");
- 现在Java7 中,我们可以这样写:
Path path = Paths.get("index.html");
同时,NIO.2在java.nio.file
包下还提供了Files
、Paths
工具类,Files包含了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法。
Paths 类提供的静态get() 方法用来获取Path 对象:
static Path get(String first, String ... more)
: 用于将多个字符串串连成路径static Path get(URI uri)
: 返回指定uri对应的Path路径
# Path接口
下面是Path常用接口
String toString()
:返回调用Path 对象的字符串表示形式boolean startsWith(String path)
: 判断是否以path 路径开始boolean endsWith(String path)
: 判断是否以path 路径结束boolean isAbsolute()
: 判断是否是绝对路径Path getParent()
:返回Path对象包含整个路径,不包含Path 对象指定的文件路径Path getRoot()
:返回调用Path 对象的根路径Path getFileName()
: 返回与调用Path 对象关联的文件名int getNameCount()
: 返回Path 根目录后面元素的数量Path getName(int idx)
: 返回指定索引位置idx 的路径名称Path toAbsolutePath()
: 作为绝对路径返回调用Path 对象Path resolve(Path p)
:合并两个路径,返回合并后的路径对应的Path对象File toFile()
: 将Path转化为File类的对象Path toPath()
:File也可以转换为Path类的对象。
# Files类
java.nio.file.Files 用于操作文件或目录的工具类。
例如,我们要把一个文件的全部内容读取为一个byte[]
,可以这么写:
byte[] data = Files.readAllBytes(Paths.get("/path/to/file.txt"));
如果是文本文件,可以把一个文件的全部内容读取为String
:
// 默认使用UTF-8编码读取:
String content1 = Files.readString(Paths.get("/path/to/file.txt"));
// 可指定编码:
String content2 = Files.readString(Paths.get("/path/to/file.txt"), StandardCharsets.ISO_8859_1);
// 按行读取并返回每行内容:
List<String> lines = Files.readAllLines(Paths.get("/path/to/file.txt"));
2
3
4
5
6
写入文件也非常方便:
// 写入二进制文件:
byte[] data = ...
Files.write(Paths.get("/path/to/file.txt"), data);
// 写入文本并指定编码:
Files.writeString(Paths.get("/path/to/file.txt"), "文本内容...", StandardCharsets.ISO_8859_1);
// 按行写入文本:
List<String> lines = ...
Files.write(Paths.get("/path/to/file.txt"), lines);
2
3
4
5
6
7
8
此外,Files
工具类还有copy()
、delete()
、exists()
、move()
等快捷方法操作文件和目录。这里就不一一展开去测试了,等后面学到框架时,需要用到时,再来查看API足以。
最后需要特别注意的是,Files
提供的读写方法,受内存限制,只能读写小文件,例如配置文件等,不可一次读入几个G的大文件。读写大型文件仍然要使用文件流,每次只读写一部分文件内容。
# 小结
对于简单的小文件读写操作,可以使用Files
工具类简化代码。