Java NIO实战分三类:1. 文件拷贝用FileChannel+ByteBuffer循环读写;2. 大文件用transferTo/transferFrom零拷贝;3. 超大文件随机访问用MappedByteBuffer内存映射。

Java NIO 的实战演练,核心是用对 Channel 和 Buffer,再结合实际场景选准模式——不是堆 API,而是理清“数据怎么进、怎么存、怎么出”这条链路。下面直接上可运行、易理解、覆盖高频需求的三类实战方式。
图片拷贝:用 FileChannel + ByteBuffer 搞定字节级精准搬运
这是最扎实的入门练手,不涉及编码、不依赖文本解析,纯粹验证二进制数据是否完整流转。
- 用 FileInputStream.getChannel() 和 FileOutputStream.getChannel() 获取双向通道
- 分配固定大小的 ByteBuffer(比如 8192 字节),避免小缓冲导致频繁系统调用
- 循环调用 channel.read(buffer) → buffer.flip() → channel.write(buffer) → buffer.clear()
- 注意:read() 返回 -1 表示读完,write() 不保证一次写完全部内容,需检查返回值并重试
大文件快速复制:用 transferTo() / transferFrom() 一行替代手动缓冲
当源和目标都是 FileChannel,且操作系统支持(Linux/Unix 大多支持),直接零拷贝传输,性能飞跃。
- 不用自己分配 ByteBuffer,不经过 JVM 堆内存
- sourceChannel.transferTo(position, count, targetChannel) —— 从源通道指定位置开始,最多传 count 字节到目标通道
- 适合 GB 级日志归档、安装包分发等场景;Windows 上可能退化为普通拷贝,但逻辑不变
- 注意 position 要配合 channel.position() 控制起始点,支持断点续传
内存映射读写:MappedByteBuffer 处理超大文件或随机访问
把文件某一段直接映射成内存区域,像操作数组一样读写,跳过传统 I/O 的内核态拷贝。
- 用 RandomAccessFile.getChannel().map() 创建只读/读写映射缓冲区
- 映射后可直接 buffer.get(i) 或 buffer.put(i, b) 访问任意偏移,无需 seek
- 适合数据库索引加载、视频帧提取、日志关键字快速定位等场景
- 注意:映射区域不能超过文件实际长度;修改后需 force() 确保刷盘;JVM 退出前建议 cleaner 回收(可通过反射触发)
这三类不是割裂的,而是按数据规模和访问模式递进:小文件用基础通道+缓冲,中大文件优先 transfer,超大/随机访问用内存映射。真正用起来,关键不在写多少行代码,而在判断清楚“我这次操作的本质是搬运?转发?还是直接触达?”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











