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()方法转换成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 以只读只写的方式打开文件

TRUNCATE_EXISTING 如果文件存在以只写的方式打开文件并清空文件












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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值