Paths和Files
Paths 类
Paths 类主要用于操作文件和目录路径。它提供了一些静态方法,用于创建java.nio.file.Path实例,代表文件系统中的路径。
// 创建一个Path实例,表示当前目录下的一个文件
Path path = Paths.get("example.txt");
// 创建一个绝对路径
Path absolutePath = Paths.get("/home/user/example.txt");
java.nio.file.Path 接口代表一个文件系统中的路径。它提供了一系列方法来操作和查询路径。
Path path = Paths.get("docs/xx.md");
// 获取文件名
System.out.println("File name: " + path.getFileName());
// 获取父目录
System.out.println("Parent: " + path.getParent());
// 获取根目录
System.out.println("Root: " + path.getRoot());
// 将路径与另一个路径结合
Path newPath = path.resolve("config/app.properties");
System.out.println("Resolved path: " + newPath);
// 简化路径
Path normalizedPath = newPath.normalize();
System.out.println("Normalized path: " + normalizedPath);
// 将相对路径转换为绝对路径
Path absolutePath = path.toAbsolutePath();
System.out.println("Absolute path: " + absolutePath);
// 计算两个路径之间的相对路径
Path basePath = Paths.get("/docs/");
Path targetPath = Paths.get("/docs/imgs/xxx");
Path relativePath = basePath.relativize(targetPath);
System.out.println("Relative path: " + relativePath);
Files 类
java.nio.file.Files类提供了大量静态方法,用于处理文件系统中的文件和目录。这些方法包括文件的创建、删除、复制、移动等操作,以及读取和设置文件属性。
// 创建一个Path实例
Path path = Paths.get("logs/xx.txt");
// 创建一个新文件
Files.createFile(path);
// 检查文件是否存在
boolean exists = Files.exists(path);
System.out.println("File exists: " + exists);
// 删除文件
Files.delete(path);
1、exists(Path path, LinkOption... options):检查文件或目录是否存在。
Path path = Paths.get("file.txt");
boolean exists = Files.exists(path);
System.out.println("File exists: " + exists);
LinkOption 是一个枚举类,它定义了如何处理文件系统链接的选项。它位于 java.nio.file 包中。LinkOption 主要在与文件或目录的路径操作相关的方法中使用,以控制这些方法如何处理符号链接。符号链接是一种特殊类型的文件,它在 Unix 和类 Unix 系统(如 Linux 和 macOS)上很常见。在 Windows 上,类似的概念被称为快捷方式。
2、createFile(Path path, FileAttribute<?>... attrs):创建一个新的空文件。
Path newPath = Paths.get("newFile.txt");
Files.createFile(newPath);
FileAttribute 是一个泛型接口,用于处理各种不同类型的属性。在使用 FileAttribute 时,你需要为其提供一个特定的实现。java.nio.file.attribute 包中的 PosixFileAttributes 类提供了 POSIX(Portable Operating System Interface,定义了许多与文件系统相关的操作,包括文件和目录的创建、删除、读取和修改。)文件属性的实现。
Path path = Paths.get("fileWithPermissions.txt");
Set<PosixFilePermission> permissions = PosixFilePermissions.fromString("rw-r-----");
FileAttribute<Set<PosixFilePermission>> fileAttribute = PosixFilePermissions.asFileAttribute(permissions);
Files.createFile(path, fileAttribute);
PosixFileAttributes 接口提供了获取 POSIX 文件属性的方法,如文件所有者、文件所属的组以及文件的访问权限。以上示例会创建一个读写属性的文件。
3、createDirectory(Path dir, FileAttribute<?>... attrs):创建一个新的目录。
Path newDir = Paths.get("newDirectory");
Files.createDirectory(newDir);
4、delete(Path path):删除文件或目录。
Path pathToDelete = Paths.get("fileToDelete.txt");
Files.delete(pathToDelete);
5、copy(Path source, Path target, CopyOption... options):复制文件或目录。
Path sourcePath = Paths.get("sourceFile.txt");
Path targetPath = Paths.get("targetFile.txt");
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
在 Java NIO 中,有两个实现了 CopyOption 接口的枚举类:StandardCopyOption 和 LinkOption。
StandardCopyOption 枚举类提供了以下两个选项:
- REPLACE_EXISTING:如果目标文件已经存在,该选项会使 
Files.copy()方法替换目标文件。如果不指定此选项,Files.copy()方法在目标文件已存在时将抛出 FileAlreadyExistsException。 - COPY_ATTRIBUTES:此选项表示在复制文件时,尽可能地复制文件的属性(如文件时间戳、权限等)。如果不指定此选项,那么目标文件将具有默认的属性。
 
6、move(Path source, Path target, CopyOption... options):移动或重命名文件或目录。
Path sourcePath = Paths.get("sourceFile.txt");
Path targetPath = Paths.get("targetFile.txt");
Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
7、readAllLines(Path path, Charset cs):读取文件的所有行到一个字符串列表。
Path path = Paths.get("file.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
lines.forEach(System.out::println);
8、write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options):将字符串列表写入文件。
Path path = Paths.get("file.txt");
List<String> lines = Arrays.asList("1", "2", "3");
Files.write(path, lines, StandardCharsets.UTF_8);
OpenOption 是 Java NIO 中一个用于配置文件操作的接口。它提供了在使用 Files.newByteChannel()、Files.newInputStream()、Files.newOutputStream()、AsynchronousFileChannel.open() 和 FileChannel.open() 方法时定制行为的选项。
在 Java NIO 中,有两个实现了 OpenOption 接口的枚举类:StandardOpenOption 和 LinkOption。
StandardOpenOption 枚举类提供了以下几个选项:
- READ:以读取模式打开文件。
 - WRITE:以写入模式打开文件。
 - APPEND:以追加模式打开文件。
 - TRUNCATE_EXISTING:在打开文件时,截断文件的内容,使其长度为 0。仅适用于 WRITE 或 APPEND 模式。
 - CREATE:当文件不存在时创建文件。如果文件已存在,则打开文件。
 - CREATE_NEW:当文件不存在时创建文件。如果文件已存在,抛出 FileAlreadyExistsException。
 - DELETE_ON_CLOSE:在关闭通道时删除文件。
 - SPARSE:提示文件系统创建一个稀疏文件。
 - SYNC:要求每次更新文件的内容或元数据时都进行同步。
 - DSYNC:要求每次更新文件内容时都进行同步。
 
8、newBufferedReader(Path path, Charset cs) 和 newBufferedWriter(Path path, Charset cs, OpenOption... options):创建 BufferedReader 和 BufferedWriter 对象以读取和写入文件。
Path path = Paths.get("file.txt");
// Read file
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
}
// Write file
Path outputPath = Paths.get("outputFile.txt");
try (BufferedWriter writer = Files.newBufferedWriter(outputPath, StandardCharsets.UTF_8)) {
    writer.write("xx");
}
Files.walkFileTree() 静态方法
这个方法可以递归地访问目录结构中的所有文件和目录,并允许您对这些文件和目录执行自定义操作。使用 walkFileTree 方法时,需要提供一个起始路径(起始目录)和一个实现了 FileVisitor 接口的对象。FileVisitor 接口包含四个方法,它们在遍历过程中的不同阶段被调用:
preVisitDirectory:在访问目录之前调用。postVisitDirectory:在访问目录之后调用。visitFile:在访问文件时调用。visitFileFailed:在访问文件失败时调用。
public static void main(String[] args) {
    Path startingDir = Paths.get("docs");
    MyFileVisitor fileVisitor = new MyFileVisitor();
    try {
        Files.walkFileTree(startingDir, fileVisitor);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private static class MyFileVisitor extends SimpleFileVisitor<Path> {
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        System.out.println("准备访问目录: " + dir);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
        System.out.println("正在访问目录: " + dir);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("访问文件: " + file);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        System.err.println("访问文件失败: " + file);
        return FileVisitResult.CONTINUE;
    }
}
其中,FileVisitResult 枚举包含以下四个选项:
- CONTINUE : 继续
 - TERMINATE : 终止
 - SKIP_SIBLINGS : 跳过兄弟节点,然后继续
 - SKIP_SUBTREE : 跳过子树(不访问此目录的条目),然后继续,仅在 preVisitDirectory 方法返回时才有意义,除此以外和 CONTINUE 相同。
 
搜索文件
public static void main(String[] args) {
    Path startingDir = Paths.get("./");
    String targetFileName = "hello.txt";
    FindFileVisitor findFileVisitor = new FindFileVisitor(targetFileName);
    try {
        Files.walkFileTree(startingDir, findFileVisitor);
        if (findFileVisitor.isFileFound()) {
            System.out.println("找到文件了: " + findFileVisitor.getFoundFilePath());
        } else {
            System.out.println("ooh,文件没找到");
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private static class FindFileVisitor extends SimpleFileVisitor<Path> {
    private final String targetFileName;
    private Path foundFilePath;
    public FindFileVisitor(String targetFileName) {
        this.targetFileName = targetFileName;
    }
    public boolean isFileFound() {
        return foundFilePath != null;
    }
    public Path getFoundFilePath() {
        return foundFilePath;
    }
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        String fileName = file.getFileName().toString();
        if (fileName.equals(targetFileName)) {
            foundFilePath = file;
            return FileVisitResult.TERMINATE;
        }
        return FileVisitResult.CONTINUE;
    }
}
Paths 和 Files 是 Java NIO 中的两个核心类。Paths 提供了一系列静态方法,用于操作路径(Path 对象)。它可以将字符串或 URI 转换为 Path 对象,方便后续操作。Files 类提供了丰富的文件操作方法,如文件的创建、删除、移动、复制、读取和写入等。这些方法支持各种选项和属性,如覆盖、保留属性和符号链接处理。Files 还支持文件遍历(如 walkFileTree 方法),可以处理文件目录树。总之,Paths 和 Files 为文件和目录操作提供了简洁、高效的方法。
Paths和Files的更多相关文章
- Java NIO学习(Path接口、Paths和Files工具类的使用)
		
NIO学习:Paths和Files工具类的使用 JDK1.7引入了新的IO操作类.在java.nio.file包下,Java NIO Path接口和Files类. Path接口:Path表示的是一个目 ...
 - Java文件IO操作应该抛弃File拥抱Paths和Files
		
Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...
 - J2SE 8的输入输出--Path/Paths File/Files; FileSystems 类的用法
		
Path的简单用法 //1. Path 正常用法 Path path = Paths.get("src/main/resource/zip"); logger.debug(path ...
 - Path;Paths和Files;FileVisitor
		
package filet; import java.io.FileOutputStream; import java.nio.file.FileStore; import java.nio.file ...
 - File、Paths和Files类的使用详解
		
Paths:通过get()方法返回一个Path对象,Path用于表示文件路径和文件. Files:提供了大量处理文件的方法,例如文件复制.读取.写入,获取文件属性.快捷遍历文件目录等..... Fil ...
 - 6.NIO2-Path、Paths、Files
		
NIO.2 jdk1.7中,java对 NIO 极大的扩展,主要增强的是对文件处理 和 文件系统特性的支持 关于其中一些API的使用 public class TestNIO_2_Path_File ...
 - Java的Path、Paths和Files
		
前言 因为这几天被java.nio的这几个接口和工具类卡到了,就顺便地查了一波文档以及使用方法,这篇其实更像是API的复制粘贴,只不过我在注释里多写了一些output和注意事项,看不惯API的可以选择 ...
 - java IO流 (九) Path、Paths、Files的使用
		
1.NIO的使用说明:>Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO AP.>NI ...
 - NIO.2中Path、 Paths、Files类的使用
 - JAVA NIO学习四:Path&Paths&Files 学习
		
今天我们将学习NIO 的最后一章,前面大部分涉及IO 和 NIO 的知识都已经讲过了,那么本章将要讲解的是关于Path 以及Paths 和 Files 相关的知识点,以对前面知识点的补充,好了言归正传 ...
 
随机推荐
- baselines算法库的安装——Ubuntu20.04系统使用anaconda环境配置
			
baselines算法库不做过多介绍,个人认为这是公开是所有reinforcement learning算法库中最权威的,虽然没有后期更新,也就是没有了学术界的state of the art , ...
 - 实验室服务彻底死机记录——硬件故障——主板pcie槽坏掉或显卡坏掉
			
2022年11月8日 后记(最新更新) 服务器送售后,售后给厂家技术打电话,厂家技术说可能是显卡的电源线松了,于是我们打开机箱把显卡的电源线紧了紧,然后神奇的事情发生了,故障解除了...... 一 ...
 - java模拟并发请求工具类(测试专用)
			
1.背景 实际生产中,我们开发好接口后可能会简单的压力测试一下,也就是说模拟并发测试,测试工具类如下: 2.工具类 package tentative.normal.other; import cn. ...
 - PHP 红包功能代码
			
前段时间被问这个问题,最近有空就写写啦,还是挺有趣的 首先做下抢红包方法分类: 对于发红包的人来说,一共有大致3类(其他的我暂时没想到,有想到可以联系我呀~) 一.拼手气红包个数不定(完全看运气) 二 ...
 - 一文搞懂DevOps、DataOps、MLOps、AIOps:所有“Ops”的比较
			
引言 近年来,"Ops"一词在 IT 运维领域的使用迅速增加.IT 运维正在向自动化过程转变,以改善客户交付.传统的应用程序开发采用 DevOps 实施持续集成(CI)和持续部署( ...
 - SMU Summer 2024 Contest Round 8
			
SMU Summer 2024 Contest Round 8 Product 思路 注意到 \(\prod\limits_{i=1}^NL_i\le10^5\),也就是说 N 不会超过 16,因为 ...
 - 2021 CCPC 哈尔滨
			
gym 开场 zsy 签了 J,gjk 签了 B,我读错了 E 的题意,gjk 读对后过了 zsy 读了 K 给我,我记得是模拟赛原题,跟欧拉定理有关,但很难.他俩过了 D I,我大概会了 G 但不会 ...
 - 在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法
			
FreeRADIUS 为AAA Radius Linux下开源解决方案,DaloRadius为图形化web管理工具. freeradius一般用来进行账户认证管理,记账管理,常见的电信运营商的宽带账户 ...
 - Java微信授权登录小程序接口
			
1.微信授权登录小程序的流程是什么 微信授权登录小程序的流程是一个涉及前端和后端交互的过程,主要目的是让用户能够使用微信账号快速登录小程序,避免重复输入用户名和密码.以下是该流程的详细步骤: 1.1前 ...
 - Blazor开发框架Known-V2.0.9
			
V2.0.9 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行.本次版本主要是修复一些BUG和表格页面功能增强. 官网:http://known.puma ...