NIO文件操作核心技巧
你提供的代码清单展示了 Java NIO 进行文件 I/O 操作的核心方法。以下是这些方法的分类、对比和关键代码示例。一、核心操作分类与对比操作类型核心类/接口关键方法/特性适用场景通道读取SeekableByteChannel/FileChannelFiles.newByteChannel(),channel.read(buffer)顺序读取文件可控制读取位置Seekable内存映射文件读取FileChannel,MappedByteBufferFileChannel.map()大文件或需要随机访问的高性能读取通道写入FileChannelFiles.newByteChannel()配合StandardOpenOption,channel.write(buffer)顺序写入文件内存映射文件写入FileChannel,MappedByteBufferFileChannel.map(FileChannel.MapMode.READ_WRITE, ...)大文件或需要随机访问的高性能写入文件复制FilesFiles.copy()简单的文件复制操作基于流的 I/OInputStream/OutputStreamFiles.newInputStream(),Files.newOutputStream()兼容传统 IO 风格的简单读写路径与文件属性Path,FilesPaths.get(),Files.exists(),Files.readAttributes()获取文件元数据、检查状态目录遍历DirectoryStream,FilesFiles.newDirectoryStream(),Files.walkFileTree()列出目录内容、递归遍历目录树二、关键代码示例1. 使用通道Channel与缓冲区Buffer读取文件这是 NIO 的基础模式通过通道从文件读取数据到缓冲区再从缓冲区处理数据。// 对应 listing 1 2 的精简版 import java.nio.*; import java.nio.channels.*; import java.nio.file.*; public class ChannelReadExample { public static void main(String[] args) { // 使用 try-with-resources 自动关闭通道 try (SeekableByteChannel channel Files.newByteChannel(Paths.get(test.txt))) { ByteBuffer buffer ByteBuffer.allocate(128); // 分配一个 128 字节的缓冲区 while (channel.read(buffer) ! -1) { // 将通道数据读入缓冲区 buffer.flip(); // 切换缓冲区为读模式 (rewind() 也可用但 flip() 更规范) while (buffer.hasRemaining()) { System.out.print((char) buffer.get()); // 从缓冲区读取字节 } buffer.clear(); // 清空缓冲区准备下一次读取 } } catch (IOException e) { e.printStackTrace(); } } }2. 使用内存映射文件Memory-Mapped File读取将文件直接映射到内存对于大文件访问效率极高。// 对应 listing 3 import java.nio.*; import java.nio.channels.*; import java.nio.file.*; public class MappedFileReadExample { public static void main(String[] args) { try (FileChannel channel (FileChannel) Files.newByteChannel(Paths.get(test.txt))) { long fileSize channel.size(); // 将整个文件映射到只读内存缓冲区 MappedByteBuffer mappedBuffer channel.map(FileChannel.MapMode.READ_ONLY, 0, fileSize); for (int i 0; i fileSize; i) { System.out.print((char) mappedBuffer.get()); } } catch (IOException e) { e.printStackTrace(); } } }3. 使用通道与缓冲区写入文件通过通道将缓冲区中的数据写入文件。// 对应 listing 4 import java.nio.*; import java.nio.channels.*; import java.nio.file.*; public class ChannelWriteExample { public static void main(String[] args) { // 指定 WRITE 和 CREATE 选项 try (FileChannel channel (FileChannel) Files.newByteChannel( Paths.get(test.txt), StandardOpenOption.WRITE, StandardOpenOption.CREATE)) { ByteBuffer buffer ByteBuffer.allocate(26); // 向缓冲区写入数据 for (int i 0; i 26; i) { buffer.put((byte) (A i)); } buffer.flip(); // 切换缓冲区为读模式以便通道从中读取数据写入文件 channel.write(buffer); // 将缓冲区内容写入通道文件 } catch (IOException e) { e.printStackTrace(); } } }4. 使用内存映射文件写入直接操作映射到内存的文件区域进行写入。// 对应 listing 6 import java.nio.*; import java.nio.channels.*; import java.nio.file.*; public class MappedFileWriteExample { public static void main(String[] args) { // 需要 READ 和 WRITE 权限来映射可读写的缓冲区 try (FileChannel channel (FileChannel) Files.newByteChannel( Paths.get(test.txt), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE)) { // 映射一个可读写的内存区域大小为 26 字节 MappedByteBuffer mappedBuffer channel.map(FileChannel.MapMode.READ_WRITE, 0, 26); for (int i 0; i 26; i) { mappedBuffer.put((byte) (A i)); // 直接操作内存映射区域 } // 无需显式写入对 MappedByteBuffer 的修改会自动反映到文件中 } catch (IOException e) { e.printStackTrace(); } } }5. 遍历目录与文件属性使用 NIO 的Files和DirectoryStream进行目录操作和属性查询。// 综合 listing 10, 11, 12, 13的要点 import java.nio.file.*; import java.nio.file.attribute.*; public class DirectoryAndAttrExample { public static void main(String[] args) throws IOException { Path dirPath Paths.get(\\MyDir); // 1. 获取文件基本属性 if (Files.exists(dirPath)) { BasicFileAttributes attrs Files.readAttributes(dirPath, BasicFileAttributes.class); System.out.println(Is directory? attrs.isDirectory()); System.out.println(Size: attrs.size()); } // 2. 使用 DirectoryStream 遍历目录非递归 try (DirectoryStreamPath stream Files.newDirectoryStream(dirPath)) { for (Path entry : stream) { System.out.println(entry.getFileName()); } } // 3. 使用 walkFileTree 递归遍历目录树 Files.walkFileTree(dirPath, new SimpleFileVisitorPath() { Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { System.out.println(Visiting file: file); return FileVisitResult.CONTINUE; } Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { System.out.println(Entering directory: dir); return FileVisitResult.CONTINUE; } }); } }三、核心要点总结通道Channel与缓冲区BufferNIO 的核心是通道和缓冲区的配合。通道代表连接缓冲区是数据容器。读写操作总是在缓冲区上进行。缓冲区状态管理Buffer的关键属性是position,limit,capacity。flip(),clear(),rewind()方法用于在这些状态间切换是正确操作缓冲区的关键。内存映射文件MappedByteBuffer通过FileChannel.map()将文件区域直接映射到内存绕过常规的通道读写可极大提升大文件或频繁访问文件的性能。文件系统操作Files和Paths类提供了丰富的静态方法用于路径解析、文件复制、属性获取和目录遍历比传统File类更强大和灵活。Try-with-Resources所有示例都使用了 try-with-resources 语句来确保通道、流等资源被自动关闭这是处理 I/O 资源的最佳实践。参考来源java nio原理和它的优点NIO流java nio linux,走进Java NIO的世界03. Java NIO Channel通道java-nio详细介绍

相关新闻

从零搭建opencode开发环境:解决命令未找到的完整指南

从零搭建opencode开发环境:解决命令未找到的完整指南

1. 项目概述:从“命令未找到”到高效开发环境 最近在社区里,看到不少朋友在尝试使用 opencode 时,遇到了一个典型的拦路虎: opencode : 无法将“opencode”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 。这个错误信息…

2026/8/6 7:27:25 阅读更多 →
职场碎片时间高效利用:用SRS闪卡背单词实现摸鱼学习

职场碎片时间高效利用:用SRS闪卡背单词实现摸鱼学习

1. 项目概述:当“摸鱼”遇上“自我提升”“摸鱼”这个词,在当代职场语境里,早已从一个略带贬义的词汇,演变成了一种心照不宣的职场生存状态。它描述的是一种在法定工作时间内,暂时脱离高强度、高专注度工作&#xff0c…

2026/8/6 7:27:25 阅读更多 →
基于腾讯云IoT与COS构建可靠嵌入式设备OTA升级方案

基于腾讯云IoT与COS构建可靠嵌入式设备OTA升级方案

1. 项目概述:为什么我们需要一个可靠的OTA升级方案?在嵌入式开发和物联网设备管理中,固件升级一直是个既关键又头疼的环节。想象一下,你负责的成千上万台设备已经部署在全国各地,甚至海外。这时,你发现了一…

2026/8/6 7:27:25 阅读更多 →

最新新闻

DeepSeek-V4-Pro API实战:与Claude、Kimi等大模型对比测试指南

DeepSeek-V4-Pro API实战:与Claude、Kimi等大模型对比测试指南

这次我们来看一个近期在开发者社区引发高度关注的技术事件:DeepSeek-V4-Pro 正式版的发布,以及它与其他顶级大模型如 Claude Fable5、5.6Sol 和 Kimi K3 的初步对比。对于关心大模型前沿动态、特别是关注模型推理能力、代码生成和综合性能的开发者来说&a…

2026/8/6 8:23:56 阅读更多 →
全周期资质服务,诊断到维护

全周期资质服务,诊断到维护

😎宝子们,今天来给大家聊聊企业全周期资质服务。对于企业来说,资质可是相当重要的,它关乎着企业的发展和竞争力。而全周期资质服务,就是从诊断到维护的一条龙服务,让企业省心省力。🌟选购要点&a…

2026/8/6 8:23:56 阅读更多 →
抖音聊天记录如何作为法律证据?秒档导出助手取证实战教程(附证据材料清单)

抖音聊天记录如何作为法律证据?秒档导出助手取证实战教程(附证据材料清单)

一、取证的困境:抖音上的证据怎么固定? 先讲一个真实的场景。 陈律师最近代理了一起案件:当事人通过抖音和诈骗分子联系,转账数万元,全部沟通都在抖音私聊里完成。要固定证据时,陈律师面临一系列难题&#…

2026/8/6 8:23:56 阅读更多 →
Godot游戏资源解包实战:从.pck文件原理到godot-unpacker工具使用

Godot游戏资源解包实战:从.pck文件原理到godot-unpacker工具使用

1. 项目概述:为什么我们需要一个Godot解包工具?如果你正在用Godot引擎开发游戏,或者对某个用Godot制作的独立游戏内部资源感到好奇,那你大概率会遇到.pck文件。这个文件是Godot用来打包游戏资源(场景、脚本、纹理、音频…

2026/8/6 8:23:56 阅读更多 →
百万缺口迫在眉睫:养老护理员短缺成高质量养老服务最大瓶颈

百万缺口迫在眉睫:养老护理员短缺成高质量养老服务最大瓶颈

导语:全国养老护理员缺口达百万级,供需失衡已危及基本照护保障据中国老龄协会及多份行业研究报告综合估算,截至2024年中,全国养老护理员缺口超过100万人。同期,我国65岁及以上人口达2.97亿,失能、失智老年人…

2026/8/6 8:23:56 阅读更多 →
117、Zephyr RTOS网络协议栈基础:MQTT客户端

117、Zephyr RTOS网络协议栈基础:MQTT客户端

Zephyr RTOS网络协议栈基础:MQTT客户端 上周调试产线上的一个温湿度采集节点,MQTT客户端连上Broker后,每隔十几秒就断线重连一次。抓包看了半天,发现是KeepAlive报文发送时机出了问题——Zephyr的MQTT库默认心跳间隔是60秒,而我设置的Publish频率是30秒,结果Broker以为客…

2026/8/6 8:22:56 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →