Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切
在 Java 7 中引入的 NIO (New I/O) 为文件系统和流的操作带来了强大的能力,其中 Path 和 Files 是核心部分。Path 作为对文件路径的抽象,提供了灵活的方式处理文件系统中的路径;Files 则通过一系列静态方法,使得文件的读写、复制、删除等操作变得简单高效。本篇博客将带你深入理解并掌握 Java NIO 中的 Path 和 Files。
目录
- 什么是 NIO
Path类详解Path的创建- 常用方法
- 处理相对路径与绝对路径
- 路径规范化与解析
Files类详解- 文件和目录操作
- 文件的读写
- 文件的复制与移动
- 文件属性管理
- 异常处理与文件锁定
- 多线程文件操作
- 实战:文件操作中的最佳实践
- 总结
1. 什么是 NIO
Java NIO (New Input/Output) 是 Java 7 中引入的一组新的 IO API。NIO 与传统的 IO API (如 File) 相比,有几个显著优势:
- 非阻塞 IO: 支持高效的文件系统与网络 IO 操作。
- 更灵活的文件操作:
Path和Files提供了一套更强大的文件系统操作接口。 - 通道与缓冲区: 提供了新的数据传输模型,提升了数据处理效率。
Path 和 Files 是 NIO API 中的重要组成部分,用于处理文件和目录。
2. Path 类详解
Path 类是 Java NIO 中用来表示文件路径的核心类,它替代了传统的 File 类。Path 可以表示绝对路径或相对路径,支持平台无关的文件路径操作。
2.1 Path 的创建
创建 Path 对象非常简单,可以使用 Paths.get() 方法:
import java.nio.file.Path;
import java.nio.file.Paths;public class PathExample {public static void main(String[] args) {Path path = Paths.get("/users/documents/file.txt");System.out.println("Path: " + path);}
}
你还可以使用相对路径:
Path relativePath = Paths.get("docs/file.txt");
2.2 常用方法
getFileName(): 获取文件名。getParent(): 获取父路径。getRoot(): 获取根目录。isAbsolute(): 判断是否是绝对路径。toAbsolutePath(): 将相对路径转换为绝对路径。
示例:
Path path = Paths.get("/users/documents/file.txt");
System.out.println("文件名: " + path.getFileName()); // 输出: file.txt
System.out.println("父路径: " + path.getParent()); // 输出: /users/documents
System.out.println("根目录: " + path.getRoot()); // 输出: /
2.3 处理相对路径与绝对路径
Path 可以处理相对路径与绝对路径。在相对路径转换为绝对路径时,可以通过 toAbsolutePath() 方法实现:
Path relativePath = Paths.get("file.txt");
Path absolutePath = relativePath.toAbsolutePath();
System.out.println("绝对路径: " + absolutePath);
2.4 路径规范化与解析
有时路径中可能包含冗余的 . 或 ..,可以使用 normalize() 方法规范化路径:
Path path = Paths.get("/users/../documents/./file.txt");
Path normalizedPath = path.normalize();
System.out.println("规范化路径: " + normalizedPath); // 输出: /documents/file.txt
3. Files 类详解
Files 类提供了操作文件和目录的一系列静态方法。无论是创建、删除、读取还是移动文件,Files 都为这些操作提供了简洁的接口。
3.1 文件和目录操作
createFile(): 创建新文件。如果文件已存在,会抛出FileAlreadyExistsException。createDirectory(): 创建新目录。delete(): 删除文件或目录。exists(): 检查文件或目录是否存在。isDirectory(): 判断路径是否为目录。
Path path = Paths.get("newFile.txt");
if (!Files.exists(path)) {Files.createFile(path);System.out.println("文件已创建: " + path);
} else {System.out.println("文件已存在: " + path);
}Files.delete(path); // 删除文件
3.2 文件的读写
write(): 将字节数组写入文件。readAllBytes(): 读取文件中的所有字节。readAllLines(): 逐行读取文件内容。
示例:
Path filePath = Paths.get("testFile.txt");// 写入文件
Files.write(filePath, "Hello, World!".getBytes());// 读取文件
String content = new String(Files.readAllBytes(filePath));
System.out.println("文件内容: " + content);
3.3 文件的复制与移动
copy(): 复制文件。move(): 移动或重命名文件。
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");// 复制文件
Files.copy(source, target);// 移动文件
Files.move(source, target);
3.4 文件属性管理
size(): 获取文件大小。getLastModifiedTime(): 获取文件的最后修改时间。setLastModifiedTime(): 设置文件的最后修改时间。
Path filePath = Paths.get("testFile.txt");// 获取文件大小
long size = Files.size(filePath);
System.out.println("文件大小: " + size + " 字节");// 获取最后修改时间
FileTime lastModifiedTime = Files.getLastModifiedTime(filePath);
System.out.println("最后修改时间: " + lastModifiedTime);
4. 异常处理与文件锁定
在处理文件时,异常处理至关重要。例如,当文件不存在时,NoSuchFileException 将会抛出。
try {Path path = Paths.get("nonexistentFile.txt");Files.delete(path);
} catch (NoSuchFileException e) {System.out.println("文件不存在: " + e.getMessage());
}
文件锁定 是一个高级操作,常用于多线程或并发文件操作。通过 FileChannel 可以获取文件的锁:
try (FileChannel channel = FileChannel.open(Paths.get("file.txt"), StandardOpenOption.WRITE)) {FileLock lock = channel.lock();System.out.println("文件已加锁");// 执行写操作lock.release();System.out.println("文件解锁");
}
5. 多线程文件操作
在多线程环境中进行文件操作时,应确保每个线程对文件的访问是安全的。Java 提供了锁定机制来防止多个线程同时写入同一个文件,避免出现数据竞争问题。
此外,可以结合线程池对文件进行并发读取:
ExecutorService executor = Executors.newFixedThreadPool(4);
for (Path file : Files.newDirectoryStream(Paths.get("/mydir"))) {executor.submit(() -> {try {String content = new String(Files.readAllBytes(file));System.out.println("文件内容: " + content);} catch (IOException e) {e.printStackTrace();}});
}
executor.shutdown();
6. 实战:文件操作中的最佳实践
-
资源关闭: 始终确保在文件操作完成后关闭资源。可以使用
try-with-resources确保资源自动关闭。 -
异常处理: 始终处理可能抛出的异常,特别是在操作外部文件时。
-
并发访问: 使用文件锁或线程安全的机制来确保并发文件访问的安全性。
-
目录遍历的优化: 使用
Files.walkFileTree()提供更灵活的遍历规则,特别是在处理大量文件时。
7. 总结
本文详细介绍了 Java NIO 中的 Path 和 Files,包括它们的创建、操作方法、文件属性管理以及高级操作如异常处理、多线程文件操作等。通过这些工具,Java 开发者可以更高效地管理文件系统,处理复杂的文件操作场景。
无论是在简单的文件读取和写入,还是在多线程环境中的并发文件操作中,Path 和 Files 提供了一个现代化、平台无关的接口,极大简化了开发中的文件处理流程。通过良好的异常处理和资源管理,你可以编写出健壮且性能优异的代码。
希望通过这篇文章,你能全面掌握 Path 和 Files,并在实际开发中灵活运用这些知识。继续深入研究 Java NIO 的其他部分,例如 Channels 和 AsynchronousFileChannel,可以让你对 Java 文件系统操作有更深入的理解。
如果你有任何问题,欢迎在评论区交流,我们可以一起探讨更多实战中的应用技巧!
相关文章:
Java NIO 全面详解:掌握 `Path` 和 `Files` 的一切
在 Java 7 中引入的 NIO (New I/O) 为文件系统和流的操作带来了强大的能力,其中 Path 和 Files 是核心部分。Path 作为对文件路径的抽象,提供了灵活的方式处理文件系统中的路径;Files 则通过一系列静态方法,使得文件的读写、复制、…...
bluez免提协议hands-free介绍,全到无法想象,bluez hfp ag介绍
零. 前言 由于Bluez的介绍文档有限,以及对Linux 系统/驱动概念、D-Bus 通信和蓝牙协议都有要求,加上网络上其实没有一个完整的介绍Bluez系列的文档,所以不管是蓝牙初学者还是蓝牙从业人员,都有不小的难度,学习曲线也相对较陡,所以我有了这个想法,专门对Bluez做一个系统…...
关于区块链的安全和隐私
背景 区块链技术在近年来发展迅速,被认为是安全计算的突破,但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述,帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…...
特征工程——一门提高机器学习性能的艺术
当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心,聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足,甚至完全忽视。类似MLOps的领域正迅速发展,通过系统性地训练和利用ML模型&…...
Paper解读:工作场所人机协作的团队形成:促进组织变革的目标编程模型
人工智能(AI)具有降低运营成本、提高效率和改善客户体验的潜力。 因此,在组织中组建项目团队至关重要,这样他们就会在决策过程中欢迎人工智能。 当前的技术革命要求公司快速变革,并增加了对团队在促进创新采用方面的作…...
图文深入理解Oracle Network配置管理(一)
List item 本篇图文深入介绍Oracle Network配置管理。 Oracle Network概述 Oracle Net 服务 Oracle Net 监听程序 <oracle_home>/network/admin/listener.ora <oracle_home>/network/admin/sqlnet.ora建立网络连接 要建立客户机或中间层连接,Oracle…...
leetcode-链表篇3
leetcode-61 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例 1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3]示例 2: 输入:head [0,1,2], k 4 输出&#x…...
RAG(Retrieval Augmented Generation)及衍生框架:CRAG、Self-RAG与HyDe的深入探讨
近年来,随着大型语言模型(LLMs)的迅猛发展,我们在寻求更精确、更可靠的语言生成能力上取得了显著进展。其中,检索增强生成(Retrieval-Augmented Generation)作为一种创新方法,极大地…...
C语言介绍
什么是C语言 C programing language 能干什么 Hello world? 如何学C语言 no reading no learning...
损失函数篇 | YOLOv10 更换损失函数之 MPDIoU | 《2023 一种用于高效准确的边界框回归的损失函数》
论文地址:https://arxiv.org/pdf/2307.07662v1.pdf 边界框回归(Bounding Box Regression,BBR)在目标检测和实例分割中得到了广泛应用,是目标定位的重要步骤。然而,对于边界框回归的大多数现有损失函数来说,当预测的边界框与真值边界框具有相同的长宽比,但宽度和高度的…...
WMware安装WMware Tools(Linux~Ubuntu)
1、这里终端里面输入sudo apt upgrade用于更新最新的包 sudo apt upgrade 2、安装 open-vm-tools-desktop 包, Ps:这里是以为我已经安装好了。 udo apt install open-vm-tools-desktop -y3、最后重启就大功告成了 reboot 4、测试是否成功:…...
SLAM ORB-SLAM2(30)关键帧跟踪
SLAM ORB-SLAM2(30)关键帧跟踪 1. 关键帧跟踪2. TrackReferenceKeyFrame2.1. 将当前普通帧的描述子转化为BoW向量2.2. 通过词袋BoW加速当前帧与参考帧之间的特征点匹配2.3. 将上一帧的位姿态作为当前帧位姿的初始值2.4. 通过优化3D-2D的重投影误差来获得位姿2.5. 剔除优化后的…...
k8s 部署 prometheus
创建namespace prometheus-namespace.yaml apiVersion: v1 kind: Namespace metadata:name: ns-prometheus拉取镜像 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/prometheus/prometheus:v2.54.0prometheus配置文件configmap prometheus-configmap.yaml …...
使用VBA快速生成Excel工作表非连续列图片快照
Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片,然后粘贴到A18单元格,如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片,但是如果Range对象为非连续区域,那么将产生10…...
解决GitHub下载速度慢
解决GitHub下载速度慢 方法一:使用git clone 地址 --depth 1来下载 depth 1 表示只科隆最新的一次提交,也就是默认主分支,而不是完整地克隆整个代码仓库,这样可以减少下载地数据,加快克隆操作 可以用git clone 地址 …...
【机器学习(五)】分类和回归任务-AdaBoost算法
文章目录 一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 (二)回归算法基本思路1、最大误差的计算2…...
【设计模式-模板】
定义 模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并将一些步骤延迟到子类中实现。通过这种方式,模板方法允许子类在不改变算法结构的情况下重新定义算法中的某些特定步骤。 UML图 组成角色 AbstractClass&#x…...
小程序原生-列表渲染
1. 列表渲染的基础用法 <!--渲染数组列表--> <view wx:for"{{numList}}" wx:key"*this" > 序号:{{index}} - 元素:{{item}}</view> <!--渲染对象属性--> <view wx:for"{{userInfo}}" wx:key&q…...
JAVA认识异常
目录 1. 异常的概念与体系结构 1.1 异常的概念 1. 算术异常 2. 数组越界异常 3. 空指针异常 1.2 异常的分类 1. 编译时异常 2. 运行时异常 2.1 异常的处理 防御式编程 2.2 异常的捕获 2.3.1 异常声明throws 2.3.2 try-catch捕获并处理 2.3.3 finally 总结 1. 异常…...
2024年10月计划(工作为主,Ue5独立游戏为辅,)
我发现一点,就是工作很忙,比如中秋也在远程加班,周末有时也远程加班,国庆节甚至也差点去甲方工作。甚至有可能驻场。可见,小公司确实不能去。 好在,9月份时,通过渲染 除了上班时间外࿰…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
