java.nio.file的主要功能
1 对文件系统本身的操作,例如文件的复制,移除,删除,创建功能,创建软连接。
2 对文件系统的属性的进行操作,例如查看或修改 文件属性、操作权限、所属用户或用户组、最后修改时间,查看文件是否隐藏、文件的长度。
3 对文件系统进行遍历。
4 使用nio的方式查看和改变文件内容。
5 对文件或文件夹的创建,删除,修改事件进行监控。
不难看出java.nio.file远比java.io强大
java.nio.file的类结构
从上图中可以看出java.nio.file包内的主要功能由Paths和Files两个类组成,其他的都是抽象类,用来封装底层文件系统的操作。
1 public static Path get(String first,String... more)
通过文件路径获得Path,文件路径根据传入的参数组合而成
2 public static Path get(URI uri)
根据uri的schema创建相应的Path,默认的schema为file
3 同时java.io.File和java.io.Dir也可以用toPath()方法转换成Path
Files:具体对文件进行操作的类,下面列出几个常用的方法
1 复制文件
copy(Path source,Path target,CopyOption... options) throws IOException
2 创建目录
createDirectories(Path dir,FileAttribute<?>... attrs) throws IOException
3 创建文件,path代表文件路径
createFile(Path path,FileAttribute<?>... attrs) throws IOException
4 创建连接,link代表目标连接,existing代表一个存在的文件
createLink(Path link,Path existing)throws IOException
5 删除文件
delete(Path path); deleteIfExists(Path path)
6 获取文件的BufferReader,BufferWriter
newBufferedReader(Path path, Charset cs), newBufferedWriter(Path path, Charset cs, OpenOption... options)
7 获取文件的InputStream,OutputStream
newInputStream(Path path, OpenOption... options),newOutputStream(Path path, OpenOption... options)
8 以字节和字符串形式读取文件
readAllBytes(Path path),readAllLines(Path path, Charset cs)
9 写入文件内容, 第二个方法的参数是CharSequence,CharSequence是一个接口,常见的实现类为StringBuilder,String,StringBuffer
write(Path path, byte[] bytes, OpenOption... options),write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
Files原理
下面是Files源码片段
private static FileSystemProvider provider(Path path) {return path.getFileSystem().provider();
}
public static InputStream newInputStream(Path path, OpenOption... options)
throws IOException
{
return provider(path).newInputStream(path, options);
}
从源码上可以看出Files通过调用FileSystemProvider提供的服务队文件系统进行操作. FileSystemProvider是通过Path来获取的,不同的Path会获取不同的FileSystemProvider.
因此FileSystemProvider具体也是构造Path时传入的URI的schema来决定的,默认是针对file://的FileSystemProvider
Files支持使用事件驱动的方式来检测文件系统的改变
public class HelloApp {
public static void main(String[] args) throws IOException, InterruptedException {
Path dirPath = Paths.get("/home/samsun/test");
WatchService watchService = dirPath.getFileSystem().newWatchService();
if (Files.notExists(dirPath)) {
Files.createDirectory(dirPath);
}
dirPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE);
Path filePath = Paths.get("/home/samsun/test/test.txt");
if (Files.exists(filePath)) {
Files.delete(filePath);
}
else {
Files.createFile(filePath);
}
WatchKey key = watchService.take();
if (key != null) {
for (WatchEvent event : key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
System.out.println(kind.name());
}
}
}
}
从上面代码示例中可以发现
1 WatchService watchService = dirPath.getFileSystem().newWatchService();用来创建WatchService,watchService用来监听事件的仿生
2 dirPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE,StandardWatchEventKinds.ENTRY_DELETE); 绑定WebService到Path的事件
3 WatchKey key = watchService.take(); //获取发生的事件,如果没有事件发生线程就会阻塞
4 for (WatchEvent event : key.pollEvents()) {
WatchEvent.Kind kind = event.kind();
}
从WatchKey中判断事件的类型
OpenOption,Files支持用几种方式打开文件
1 APPEND 打开文件后,写入文件的数据自动放到文件最后
2 CREATE 创建新的文件如果文件不存在
3 CREATE_NEW 创建新文件,文件存在直接抛出异常
4 DELETE_ON_CLOSE Files关闭后自动删除文件
5 SYNC,DSYNC, 以同步的方式改变文件内容或属性
6 READ,WRITE 以只读只写的方式打开文件
7 TRUNCATE_EXISTING 如果文件存在以只写的方式打开文件并清空文件