NIO2是在NIO的基础上进行的扩展。Java 7 对原有的NIO进行了改进:
- 提供了全面的文件IO和文件系统访问支持:表现为Java 7新增的java.nio.file包及其各个子包
- 基于异步Channel的IO : 在java.nio.channels包下新增了多个以Asynchronous开头的Channel接口和类
Java 8进一步增强了Files工具类的用法,允许开发者使用Stream API来操作文件目录和文件内容。
一、重要类
NIO2或者说NIO中的核心类:Path、 Paths、Files
对应早期Java中的File类,File类是用来访问文件系统,但是功能有限(尽管我还用的挺舒服的),它不能利用特定文件系统的特性,其提供方法的访问性能也不高,NIO2为了弥补这种不足,引入了Path接口,Path代表一个平台无关的平台路径。
另外Files、Paths是两个工具类,包含大量的静态方法。
1、Path类
对应原有的java.io.File类
使用示例:
|
2、Files工具类、Paths工具类
|
3、FileVisitor遍历目录和文件
FileVisitor是一个接口,默认实现类SimpleFileVisitor。FileVisitor中的方法:
1、访问目录前触发的方法
FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
2、访问文件时触发的方法
FileVisitResult visitFile(T file, BasicFileAttributes attrs)
3、访问文件失败时触发的方法
FileVisitResult visitFileFailed(T file, IOException exc)
4、访问目录后触发的方法
FileVisitResult postVisitDirectory(T dir, IOException exc)
其返回值是 FileVisitResult, FileVisitResult是个枚举:
|
4、使用WatchService监控文件变化
考虑这样一个需求:需要监控文件的变化,那该怎样做呢?常规的做法就是启动一个线程(定时任务),每隔一段时间去『遍历』一次指定的目录的文件,如果遍历的结果和上次不同,则认为文件发生了变化。但是有没有更好的方式来实现呢?
NIO2利用WatchService类提供了如下一个监听文件系统的变化的方法:
示例:
|
5、访问文件属性的一些高级方式
早期的File类可以访问一些简单的文件属性,比如文件大小、修改时间、文件是否隐藏、是文件还是目录等。如果需要获取或修改更多的文件属性,这是可以利用Java 7的NIO2在java.nio.file.attribute包下提供的大量工具类。
示例:
|