【java基础】使用Path和Files类,更方便的操作路径和文件

说明

这篇文章会基于Path和Files这2个类来对文件进行操作,使用起来会比File类方便很多。Files当成工具类用就行了。


Path介绍

Path是一个接口,里面定义了许多操作路径的便捷方法。

获取Path是通过Paths类里面的get方法

在这里插入图片描述

        Path path = Paths.get("a", "b", "c.txt");

这个方法会将我们传入的字符串通过路径分隔符连接起来,上面的path连接后的内容如下

a\b\c.txt

Path里面的方法大家根据需要进行使用即可,都很简单。基本包含了所有对路径的操作

在这里插入图片描述

读写文件

通过Files可以很轻松的进行文件的读写

        Path path = Paths.get("a.txt");
        // 获取文件的全部字节
        byte[] bytes = Files.readAllBytes(path);
        // 按行读取所有内容
        List<String> lines = Files.readAllLines(path);

        // 通过追加方式写入字节数组
        Files.write(path, bytes, StandardOpenOption.APPEND);
        // 将文本行写入文件。每一行都是一个字符序列,并按顺序写入文件,每一行以平台的行分隔符结束
        Files.write(path, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);

对于文件长度较大的文本或者是二进制文件,还是应当使用输入输出流的方式来进行,可以通过Files轻松的创建流

        Path path = Paths.get("a.txt");

        InputStream inputStream = Files.newInputStream(path, StandardOpenOption.APPEND);
        OutputStream outputStream = Files.newOutputStream(path);
        Writer writer = Files.newBufferedWriter(path, StandardOpenOption.APPEND);
        Reader reader = Files.newBufferedReader(path);

我们在进行文件写的时候可以传入一个或多个OpenOption,选项如下
在这里插入图片描述
在这里插入图片描述


创建文件和目录

下面代码用于创建目录

        Path path = Paths.get("a/b/c");

        // 只能创建最后一级目录,也就是除了最后一个文件夹外,其他文件夹都要存在
        Path directory = Files.createDirectory(path);
        // 创建多级目录
        Path directories = Files.createDirectories(path);

下面代码用于创建文件

        Path path = Paths.get("b.txt");

        // 创建文件,如果存在就抛出异常
        Path file = Files.createFile(path);

复制、移动和删除文件

复制文件

        Path path1 = Paths.get("a.txt");
        Path path2 = Paths.get("b.txt");

        // 将a.txt复制到path2所在的目录下,新文件名称为b.txt
        Path copy = Files.copy(path1, path2);

移动文件

        Path path1 = Paths.get("a.txt");
        Path path2 = Paths.get("move_a.txt");

        // 将a.txt移动到path2所在的目录下,新文件名称为move_a.txt
        Path move = Files.move(path1, path2);

删除文件

        Path path = Paths.get("a.txt");
        
        // 删除文件,不存在抛出异常
        Files.delete(path);
        // 如果存在该文件就删除
        Files.deleteIfExists(path);

对于复制和移动方法,我们还可以传入一个或多个CopyOption,就是表示我们以何种方式来操作文件。下面给出了CopyOption的选项和解释
在这里插入图片描述
方便表示替换一个存在的文件,将属性复制到新文件,文件操作是原子性的。


获取文件信息

下面的静态方法都将返回一个boolean值,表示检查路径的某个属性的结果:

  • exists
  • isHidden
  • isReadable,isWritable,isExecutable
  • isRegularFile,isDirectory,isSymbolicLink

size方法将返回文件的字节数:

	long fileSize = Files.size(path);

getOwner方法将文件的拥有者作为java.nio.file,attribute,UserPrincipal的一个实例返回。所有的文件系统都会报告一个基本属性集,它们被封装在BasicFileAttributes接口中,这些属性与上述信息有部分重叠。基本文件属性包括:

  • 创建文件、最后一次访问以及最后一次修改文件的时间,这些时间都表示成java.nio.file.attribute.FileTime。
  • 文件是常规文件、目录还是符号链接,抑或这三者都不是。
  • 文件尺寸。
  • 文件主键,这是某种类的对象,具体所属类与文件系统相关,有可能是文件的唯一标
    识符,也可能不是。

获取这些属性可以通过下列调用

        Path path = Paths.get("a.txt");

        BasicFileAttributes basicFileAttributes = Files.readAttributes(path, BasicFileAttributes.class);
        // 如果文件相同兼容POSIX,可以获取PosixFileAttributes实例
        PosixFileAttributes posixFileAttributes = Files.readAttributes(path, PosixFileAttributes.class);

BasicFileAttributes 支持的方法如下

在这里插入图片描述

PosixFileAttributes支持的方法如下

在这里插入图片描述

我们在获取属性的时候还可以传入LinkOption选项,该选项的内容如下

在这里插入图片描述


访问目录中的项

现在有以下的目录结构

在这里插入图片描述
使用Files.list可以访问第一层子目录

        Path path = Paths.get("a/");

        try (Stream<Path> pathStream = Files.list(path)) {
    
    
            pathStream.forEach(System.out::println);
        }

输出为

a\b
a\b1

如果想要访问所有子目录,使用Files.walk

        Path path = Paths.get("a/");

        try (Stream<Path> pathStream = Files.walk(path)) {
    
    
            pathStream.forEach(System.out::println);
        }

输出如下

a
a\b
a\b\c
a\b1
a\b1\c1

可以发现访问方式是dfs,也就是深搜。

在walk函数中还可以传入FileVisitOption,选项内容如下

在这里插入图片描述


总结

Files里面方便的方法还有很多,这里只说明了几个常用的方法,感兴趣可以直接再去看一下官网文档。

猜你喜欢

转载自blog.csdn.net/m0_51545690/article/details/129930589