Netty入门到超神系列-Java NIO零拷贝实战

简介: 这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。

前言

这一章我们来操作一下NIO的零拷贝,这里我会先写代码样式一下传统IO数据拷贝场景下的耗时,然后再对比NIO场景下的考别耗时,通过耗时差异就能看到NIO零拷贝和传统IO拷贝的区别了。

传统IO拷贝

服务端

服务端主要是接收一下客户端传输过来的数据

//普通拷贝 - 服务端publicclassSocketServer {
publicstaticvoidmain(String[] args) throwsException {
//创建ServerSocketServerSocketserverSocket=newServerSocket(5000);
while(true){
//接待请求Socketsocket=serverSocket.accept();
//获取输入流DataInputStreamdataInputStream=newDataInputStream(socket.getInputStream());
//读取数据byte[] bytes=newbyte[1024];
intsize=0;
while(true){
try{
size=dataInputStream.read(bytes,0,bytes.length);
if(size==-1)break;
//读数据                }catch (Exceptione){
e.printStackTrace();
                }
            }
        }
    }
}

客户端

客户端我们从磁盘读取一个文件,然后通过socket进行网络传输,并记录下消耗的时间

publicclassSocketClient {
publicstaticvoidmain(String[] args) throwsException {
//创建SocketSocketsocket=newSocket("127.0.0.1",5000);
//文件输入流FileInputStreamfileInputStream=newFileInputStream("D:\\idea-space\\idea-code\\netty-demo\\src\\main\\java\\cn\\itsource\\nio\\zerocopy\\img.zip");
//输出流OutputStreamoutputStream=socket.getOutputStream();
byte[] bytes=newbyte[10240];
intsize=0 ;
inttotal=0;
longstart=System.currentTimeMillis();
//把文件中的数据写到socketwhile((size=fileInputStream.read(bytes)) !=-1){
total+=size;
outputStream.write(bytes);
        }
//发送:1813047字节,耗时:16System.out.println("发送:"+total+"字节,耗时:"+(System.currentTimeMillis() -start));
outputStream.close();
fileInputStream.close();
socket.close();
    }
}

我这里 发送:1813047字节,耗时:16

Java NIO拷贝

NIO拷贝要的事情和上面是一样的,只是代码有些差别

服务端

publicclassNIOCopyServer {
publicstaticvoidmain(String[] args) throwsIOException {
//服务端ServerSocketChannelserverSocketChannel=ServerSocketChannel.open();
//监听serverSocketChannel.bind(newInetSocketAddress("127.0.0.1",6000));
//缓冲区ByteBufferbyteBuffer=ByteBuffer.allocate(1024);
while (true){
SocketChannelsocketChannel=serverSocketChannel.accept();
while(true){
if(-1!=socketChannel.read(byteBuffer)){
break;
                }
//为了重复利用buffer,考完一次就清空byteBuffer.clear();
            }
        }
    }
}

客户端

JAVA中的NIO零拷贝可以通过 fileChannel.transferTo 方法来实现 ,具体代码如下

publicclassNIOCopyClient {
publicstaticvoidmain(String[] args) throwsIOException {
//创建通道SocketChannelsocketChannel=SocketChannel.open();
//链接服务端socketChannel.connect(newInetSocketAddress("127.0.0.1",6000));
//文件输入流FileInputStreamfileInputStream=newFileInputStream("D:\\idea-space\\idea-code\\netty-demo\\src\\main\\java\\cn\\itsource\\nio\\zerocopy\\img.zip");
//读文件的通道FileChannelfileChannel=fileInputStream.getChannel();
longstart=System.currentTimeMillis();
//transferTo 方法使用到了零拷贝技术//注意:在window上该方法一次只是支持8m数据拷贝,如果数据比价大,需要切片后多次传输longtotal=fileChannel.transferTo(0, fileChannel.size(), socketChannel);
//发送字节数:1813047 ,耗时:4System.out.println("发送字节数:"+total+" ,耗时:"+(System.currentTimeMillis() -start));
fileInputStream.close();
fileChannel.close();
socketChannel.close();
    }
}

同样的文件,同样的大小,发送字节数:1813047 , NIO 耗时:4 ,而传统IO拷贝 16,我这里文件2M不到,如果文件再大一点,效果更加明显。

文章到这就结束了,这一章比较简单,只是一个小案例,凑个篇数。当然点赞还是要求一下的,万一屏幕面前的大帅哥,或者大漂亮一不小心就一键三连了啦,那我就是熬夜到头发掉光,也出下章

目录
相关文章
|
10月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
1461 4
|
10月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1804 1
|
8月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
375 119
|
9月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1186 0
|
9月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
610 100
|
10月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
9月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
3437 8
|
9月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
1486 12
|
8月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
10月前
|
算法 Java 开发者
Java流程控制:条件与循环结构实战
本文深入讲解编程中的流程控制结构,涵盖条件语句(if-else、switch)、循环结构(for、while、do-while)及循环控制关键字(break、continue)的使用技巧与实战案例,帮助开发者写出更清晰、高效的代码。