java.nio.file._java.nio.file深度剖析
大多数JAVA程序员对文件进行操作完全是基于java.io.File,java.io.Dir提供的服务.最近研究了java.nio.file包后,发现java.nio.file完全可以替代java.io.File。java.nio.file的主要功能1 对文件系统本身的操作,例如文件的复制,移除,删除,创建功能,创建软连接。2 对文件系统的属性的进行操作,例如查看或修改 文件属性、操作权限、所属用户或用户组、最后修改时间,查看文件是否隐藏、文件的长度。3 对文件系统进行遍历。4 使用nio的方式查看和改变文件内容。5 对文件或文件夹的创建,删除,修改事件进行监控。
不难看出java.nio.file远比java.io强大
java.nio.file的类结构
从上图中可以看出java.nio.file包内的主要功能由Paths和Files两个类组成,其他的都是抽象类,用来封装底层文件系统的操作。
Paths:用来生成一个实现Path接口的实现类。由于jvm运行的平台不同,会得到不同的Path实现类。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()方法转换成PathFiles:具体对文件进行操作的类,下面列出几个常用的方法1 复制文件copy(Path source,Path target,CopyOption… options) throws IOException2 创建目录createDirectories(Path dir,FileAttribute>… attrs) throws IOException3 创建文件,path代表文件路径createFile(Path path,FileAttribute>… attrs) throws IOException4 创建连接,link代表目标连接,existing代表一个存在的文件createLink(Path link,Path existing)throws IOException5 删除文件delete(Path path); deleteIfExists(Path path)6 获取文件的BufferReader,BufferWriternewBufferedReader(Path path, Charset cs), newBufferedWriter(Path path, Charset cs, OpenOption… options)7 获取文件的InputStream,OutputStreamnewInputStream(Path path, OpenOption… options),newOutputStream(Path path, OpenOption… options)8 以字节和字符串形式读取文件readAllBytes(Path path),readAllLines(Path path, Charset cs)9 写入文件内容, 第二个方法的参数是CharSequence,CharSequence是一个接口,常见的实现类为StringBuilder,String,StringBufferwrite(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 如果文件存在以只写的方式打开文件并清空文件
还没有评论,来说两句吧...