java.nio.file._java.nio.file深度剖析

缺乏、安全感 2022-11-08 14:29 233阅读 0赞

大多数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 条评论,233人围观)

还没有评论,来说两句吧...

相关阅读

    相关 vector深度剖析

    一、vector特点 vector对象是动态存储的,从这一点看有点像链表,可以动态的增加或减少元素。我们也知道链表中是有指针变量,专门用于存储上一个和下一个元素的地址。正是因

    相关 C语言深度剖析

    《C 语言深度解剖》这本书是一本“解开程序员面试笔试的秘密”的好书。作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中常见的考点,并且

    相关 深度强化学习剖析

    深度强化学习剖析 深度强化学习是深度学习与强化学习的结合,具体来说是结合了深度学习的结构和强化学习的思想: ![这里写图片描述][70] 也可以说是将深度学习的感知能

    相关 task深度剖析

    Executor接收到了LaunchTask的请求(TaskRunner运行) 会做一些准备操作,比如说,反序列话Task(发送过来的时候是序列话的),然后通过网络拉取需要的