为什么要使用Java 7的file I/O实现
在Java 7以前,java.io.File类提供了file I/O实现。但其有很多缺点:
- 许多方法失败时不会抛出异常,因此也就不可能提供更多有用的信息为客户端提供帮助。比如,一个文件删除失败,客户端不知道是否存在,还是没有权限,还是其他问题导致。
- 重命名不能跨平台保持一致性。
- 对symbolic links没有真正的支持。
- 对元数据没有更多的支持,比如,文件权限,拥有者,其他的安全属性。
- 访问文件系统是低效的。
- 大部分方法不可扩展。在服务器上请求一个大目录列表可能会导致挂起。大目录也可能导致内存资源问题,导致服务拒绝。
- 如果出现symbolic links循环引用,不能写出一个可靠的递归文件树代码,也不能得到合适的响应。
Java 7的file I/O API的关键入口
在java.nio.file包中
- Path类,代表文件系统的一个文件或一个目录。提供的方法可以用于操作一个抽象的路径。
![0035cc0325f054c9f534bd5eefa13066.png](https://i-blog.csdnimg.cn/blog_migrate/6b2bdf1413d189fa64043eee0cf4f1dd.jpeg)
- Paths类,工具类,通过一个路径字符串获取到一个依赖特定系统的Path对象。
- Files类,提供了具体操作文件或目录的方法。比如,删除,创建,拷贝,获取文件或目录元数据等。
![02083df188fdf1016205cf9327326b09.png](https://i-blog.csdnimg.cn/blog_migrate/67ed206359ac454eae9dda658ad4fedd.jpeg)
- FileSystem类,提供获取文件系统相关的方法。比如,通过一个路径字符串获取到一个依赖特定系统的Path对象;可以获取文件系统的所有的文件存储。
- FileStore类,一个文件系统有多个文件存储,FileStore代表底层的存储设备,比如设备,分区等。在Unix操作系统中,每一个装载的文件系统都是一个FileStore;而在Windows操作系统中,每一个卷代表一个FileStore,如C:,D:。
重构
- 原来的代码中使用java.io.File类,现在想要利用java.nio.file包中的新功能
Path input = file.toPath();
将原有的java.io.File实例转换为java.nio.file.Path实例。然后就可以利用Path和Files来操作文件或目录。
- 如果你不想使用第一种方法,或并不完全满足需求,那就重写file I/O相关的代码。