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的类结构

132096352_1_20180504043345550

从上图中可以看出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 如果文件存在以只写的方式打开文件并清空文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值