第一章Netty,NIO零拷贝详细实现代码 基于前文对 ‌NIO 零拷贝原理‌sendfile 与 mmap及‌高并发场景‌的讨论以下是两种核心零拷贝技术的详细 Java 实现代码。先看一段传统IO模型的文件拷贝代码packagecom.example.demo;importjava.io.File;importjava.io.IOException;importjava.io.RandomAccessFile;importjava.net.Socket;publicclassFileNioTest{publicstaticvoidmain(String[]args)throwsIOException{FilefnewFile(netty.txt);RandomAccessFilefilenewRandomAccessFile(f,r);byte[]bufnewbyte[(int)f.length()];intreadfile.read(buf);SocketsocketnewSocket();socket.getOutputStream().write(buf);}}传统IO工作流程一、 基于 transferTo 的文件网络传输推荐这是最纯粹的零拷贝适用于‌静态资源服务器‌或‌大文件上传/下载‌。数据直接在内核态从 Page Cache 传输到 Socket Buffer不经过用户态。1. 服务端代码发送文件importjava.io.FileInputStream;importjava.net.InetSocketAddress;importjava.nio.channels.FileChannel;importjava.nio.channels.ServerSocketChannel;importjava.nio.channels.SocketChannel;publicclassZeroCopyServer{publicstaticvoidmain(String[]args)throwsException{// 1. 创建 ServerSocketChannelServerSocketChannelserverSocketChannelServerSocketChannel.open();serverSocketChannel.bind(newInetSocketAddress(8080));System.out.println(Server started on port 8080...);while(true){// 2. 接受连接SocketChannelsocketChannelserverSocketChannel.accept();// 3. 获取文件通道FileChannelfileChannelnewFileInputStream(large_file.dat).getChannel();// 4. 【核心】零拷贝传输// transferTo 底层调用 sendfile数据不经过用户空间longtransferredfileChannel.transferTo(0,fileChannel.size(),socketChannel);System.out.println(Total bytes transferred: transferred);// 5. 关闭资源fileChannel.close();socketChannel.close();}}}2. 客户端代码接收文件importjava.io.FileOutputStream;importjava.net.InetSocketAddress;importjava.nio.channels.FileChannel;importjava.nio.channels.SocketChannel;publicclassZeroCopyClient{publicstaticvoidmain(String[]args)throwsException{// 1. 连接服务器SocketChannelsocketChannelSocketChannel.open();socketChannel.connect(newInetSocketAddress(localhost,8080));// 2. 获取文件输出通道FileChannelfileChannelnewFileOutputStream(received_file.dat).getChannel();// 3. 读取数据并写入文件// 注意客户端接收通常仍涉及一次从内核到用户空间的拷贝除非使用 DirectBuffer write// 但服务端发送已实现零拷贝整体性能显著提升longbytesReadfileChannel.transferFrom(socketChannel,0,Long.MAX_VALUE);System.out.println(Total bytes received: bytesRead);// 4. 关闭资源fileChannel.close();socketChannel.close();}}二、 基于 MappedByteBuffer 的大文件随机读写适用于‌数据库索引‌、‌日志分析‌等需要频繁随机访问大文件的场景。通过内存映射避免传统 read/write 的系统调用开销。1. 写入大文件示例importjava.io.RandomAccessFile;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;publicclassMappedFileWriter{publicstaticvoidmain(String[]args)throwsException{StringfilePathmapped_large_file.dat;longfileSize1024*1024*100;// 100MB// 1. 创建 RandomAccessFile 和 FileChannelRandomAccessFilerafnewRandomAccessFile(filePath,rw);FileChannelchannelraf.getChannel();// 2. 【核心】内存映射// MapMode.READ_WRITE: 读写模式// position: 0, size: fileSizeMappedByteBuffermappedBufferchannel.map(FileChannel.MapMode.READ_WRITE,0,fileSize);// 3. 直接操作内存如同操作数组for(inti0;i1024;i){mappedBuffer.putInt(i*4,i);// 在偏移量 i*4 处写入整数 i}// 4. 强制刷新到磁盘可选确保数据持久化mappedBuffer.force();System.out.println(Data written to mapped file.);// 5. 关闭资源channel.close();raf.close();}}2. 读取大文件示例importjava.io.RandomAccessFile;importjava.nio.MappedByteBuffer;importjava.nio.channels.FileChannel;publicclassMappedFileReader{publicstaticvoidmain(String[]args)throwsException{StringfilePathmapped_large_file.dat;// 1. 创建 RandomAccessFile 和 FileChannelRandomAccessFilerafnewRandomAccessFile(filePath,r);FileChannelchannelraf.getChannel();// 2. 内存映射只读模式MappedByteBuffermappedBufferchannel.map(FileChannel.MapMode.READ_ONLY,0,channel.size());// 3. 随机读取数据intvaluemappedBuffer.getInt(0);// 读取偏移量 0 处的整数System.out.println(Value at offset 0: value);intvalueAt1024mappedBuffer.getInt(1024*4);System.out.println(Value at offset 4096: valueAt1024);// 4. 关闭资源channel.close();raf.close();}}三、 关键注意事项‌资源关闭‌FileChannel 和 SocketChannel 必须显式关闭否则会导致文件描述符泄漏。‌内存映射释放‌MappedByteBuffer 占用的堆外内存不会立即被 GC 回收。若需手动释放可借助 sun.misc.Cleaner非官方 API需谨慎使用或通过反射调用 clean() 方法。‌小文件性能‌对于极小文件 1KB零拷贝的系统调用开销可能高于传统 I/O此时传统 read/write 可能更优。‌平台差异‌transferTo 在 Linux 下性能最佳完整零拷贝在 Windows 下可能退化为部分拷贝实现。

相关新闻

最新新闻

2026企业AI基础设施安全基线实战手册:API网关+向量数据库+提示词管道检测清单

2026企业AI基础设施安全基线实战手册:API网关+向量数据库+提示词管道检测清单

2026年过半,国内八成以上中大型企业都落地了私有化大模型、RAG知识库或者AI Agent。 大部分团队把资源全砸在模型调优、召回准确率上,安全全靠运气。传统WAF拦不住提示词注入,数据库安全规范套不到向量库上,API密钥散落在各个业务…

2026/7/3 17:33:36
强吸金树脂

强吸金树脂

在贵金属回收、矿山提金、电镀废料处理圈子待了快十年,我发现很多同行都卡在同一个问题上:明明手里有稳定的含金废液、尾矿料,忙活大半年,利润却始终上不去。不是原料不够,也不是金价行情不好,大多是栽在了…

2026/7/3 17:33:36
戴森球计划蓝图库:从新手到专家的工厂设计革命

戴森球计划蓝图库:从新手到专家的工厂设计革命

戴森球计划蓝图库:从新手到专家的工厂设计革命 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 还在为戴森球计划中复杂的工厂布局头疼吗?每次看到星…

2026/7/3 17:33:36
百考通:AI精准精准赋能论文降重与去AI痕迹,满足多元研究场景

百考通:AI精准精准赋能论文降重与去AI痕迹,满足多元研究场景

在学术写作与论文发表的过程中,重复率过高、AI生成痕迹明显,是困扰无数学生与科研工作者的核心难题。不仅可能导致查重不通过,更会影响学术诚信与成果认可度。百考通(https://www.baikaotongai.com) 凭借智能文本优化技…

2026/7/3 17:33:36
Python深入浅出:从入门到工程实践4

Python深入浅出:从入门到工程实践4

第 4 章:数据结构 Python 的 builtin 数据结构不是程序员的"备用工具",而是日常编码的"主武器"。真正的高手不是记住每个 API,而是理解每种结构在内存中的形态,以及它在时间复杂度和空间复杂度上的取舍。 学习目标 读完本章后,你将能够: 在列表、元…

2026/7/3 17:33:36
全国县域多政策 DID 面板数据集

全国县域多政策 DID 面板数据集

一、数据基础概况数据编号:2384时间跨度:2000—2025 年县域年度平衡面板,共 26 年长时序空间样本:全国全部县、县级市、市辖区完整覆盖数据格式:Excel 标准化面板,统一行政区划编码,可直接导入 …

2026/7/3 17:28:36

周新闻

月新闻