Java NIO 的“零拷贝(Zero-Copy)” 是一种在文件传输、网络收发等场景中,减少数据在内存之间不必要的拷贝次数和 CPU 上下文切换 的技术,用来提升 I/O 性能。
下面从「传统 I/O 的问题」→「NIO 零拷贝是什么」→「Java 中怎么用」逐步说明。
以 从磁盘读文件并通过网络发送 为例:
FileInputStream in = new FileInputStream(file);
Socket socket = ...;
byte[] buf = new byte[1024];
while ((len = in.read(buf)) != -1) {
socket.getOutputStream().write(buf);
}
并且:
零拷贝并不是“完全不拷贝”,而是:
减少 用户空间参与的拷贝次数,让数据尽量只在内核空间流动
Java NIO 中主要通过以下方式实现:
FileChannel.transferTo()(最常用)FileChannel fileChannel = new FileInputStream(file).getChannel();
SocketChannel socketChannel = ...;
fileChannel.transferTo(0, fileChannel.size(), socketChannel);
sendfile()磁盘 → 内核缓冲区 → 网卡
✅ 非常适合:
FileChannel.map()(内存映射文件)MappedByteBuffer buffer = fileChannel.map(
FileChannel.MapMode.READ_ONLY, 0, size);
read() 系统调用拷贝✅ 适合:
⚠ 注意:
transferTo❌ 不是所有场景都能用
❌ 只能 文件 → 网络 / 文件 → 文件
❌ 不支持:
Java NIO 零拷贝 = 利用内核能力(sendfile / mmap),避免数据在用户空间和内核空间之间来回拷贝,提升 I/O 性能
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。