NIO学习

文章目录

  • 前言
  • 一、主要模块
  • 二、使用步骤
    • 1.服务器端
    • 2.客户端
  • 三、NIO零拷贝(推荐)
  • 四、NIO另一种copy
  • 总结


前言

NIO是JDK1.4版本带来的功能,区别于以往的BIO编程,同步非阻塞极大的节省资源开销,避免了线程切换和上下文切换带来的资源浪费。


一、主要模块

  1. Selector:选择器,为事件驱动,做中央调度使用,一个选择器可以注册多个channel;
  2. Channel:通道,信息流通;支持读取和写入数据,一个通道可以有多个Buffer;
  3. Buffer:缓存区,存放数据,支持读取和写入的切换;

二、使用步骤

1.服务器端

代码如下(示例):

package nio;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;
import java.util.Set;/*** Create by zjg on 2022/9/11*/
public class NIOServer {public static void main(String[] args) {try {ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();serverSocketChannel.configureBlocking(false);serverSocketChannel.bind(new InetSocketAddress(6666));Selector selector =Selector.open();serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);while(true){if(selector.select(10000)==0){System.out.println("没有接收到监听事件");continue;}Set<SelectionKey> selectionKeys = selector.selectedKeys();Iterator<SelectionKey> iterator = selectionKeys.iterator();while (iterator.hasNext()){SelectionKey selectionKey = iterator.next();if(selectionKey.isAcceptable()){System.out.println("获取到新的连接");SocketChannel socketChannel = serverSocketChannel.accept();socketChannel.configureBlocking(false);socketChannel.register(selector,SelectionKey.OP_READ,ByteBuffer.allocate(1024));}if(selectionKey.isReadable()){SocketChannel socketChannel = (SocketChannel)selectionKey.channel();ByteBuffer byteBuffer = (ByteBuffer) selectionKey.attachment();int read = socketChannel.read(byteBuffer);if(read==-1){selectionKey.cancel();}else{String req=new String(byteBuffer.array()).trim();System.out.println("nio客户端说:"+req);String res= "服务器响应["+LocalDateTime.now().format(DateTimeFormatter.ISO_DATE)+" "+LocalDateTime.now().format(DateTimeFormatter.ISO_TIME)+"]:"+req;System.out.println(res);socketChannel.write(ByteBuffer.wrap(res.getBytes()));}}iterator.remove();}}} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述

2.客户端

代码如下(示例):

package nio;import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;/*** Create by zjg on 2022/9/11*/
public class NIOClient {public static void main(String[] args) {try {SocketChannel socketChannel = SocketChannel.open();socketChannel.configureBlocking(false);InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 6666);if(!socketChannel.connect(inetSocketAddress)){while (!socketChannel.finishConnect()){System.out.println("等待连接完成!");}}String message="向往自由!";ByteBuffer byteBuffer = ByteBuffer.wrap(message.getBytes());socketChannel.write(byteBuffer);System.out.println("请求完成!");ByteBuffer allocate = ByteBuffer.allocate(1024);while (true){int read = socketChannel.read(allocate);if(read==0){continue;}System.out.println("---"+new String(allocate.array()).trim());socketChannel.close();break;}} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述

三、NIO零拷贝(推荐)

package nio;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;/*** Create by zjg on 2022/9/11*/
public class NIOZeroCopy {public static void main(String[] args) {FileChannel src = null;FileChannel dest = null;try {src=new FileInputStream("2.txt").getChannel();dest=new FileOutputStream("3.txt").getChannel();long start = System.currentTimeMillis();src.transferTo(0,src.size(),dest);long end = System.currentTimeMillis();System.out.println("copy完成,共"+src.size()+"byte,用时"+(end-start)+"毫秒");} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {if(src!=null){try {src.close();} catch (IOException e) {e.printStackTrace();}}if(dest!=null){try {dest.close();} catch (IOException e) {e.printStackTrace();}}}}
}

在这里插入图片描述

四、NIO另一种copy

package nio;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;/*** Create by zjg on 2022/9/18*/
public class NIOTest {public static void main(String[] args) {File source=new File("2.txt");File target=new File("4.txt");try {long start = System.currentTimeMillis();Files.copy(source.toPath(),target.toPath());long end = System.currentTimeMillis();System.out.println("copy完成,共"+source.length()+"byte,用时"+(end-start)+"毫秒");} catch (IOException e) {e.printStackTrace();}}
}

在这里插入图片描述
效率稍微慢点,用起来简单。


总结

回到顶部
刚开始写,请大佬指点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux学习】Linux编辑器-vim使用

这里写目录标题 1. &#x1f320;vim的基本概念&#x1f320;2. vim的基本操作&#x1f320;3.vim异常处理&#x1f320;4. vim正常模式的相关命令&#x1f320;5. vim末&#xff08;底&#xff09;行模式相关命令 vi/vim都是多模式编辑器&#xff0c;不同的是vim是vi的升级版本…

达梦数据库一体机树立金融解决方案标杆

达梦数据库一体机自问世以来&#xff0c;获得众多行业用户的高度关注&#xff0c;并率先在金融行业吹响冲锋号角&#xff0c;实现多个重大项目的落地应用。近日&#xff0c;珠海华润银行股份有限公司基于达梦数据库一体机 I 系列的《数据库一体机银行多业务系统集中部署解决方案…

(保姆级教学)跨站请求伪造漏洞

1. CSRF漏洞 CSRF&#xff08;Cross-site request forgery&#xff09;跨站请求伪造&#xff0c;也被称为One Click Attack 或者Session Riding&#xff0c;通常缩写为CSRF或者XSRF&#xff0c;是一种对网站的恶意利用。尽管听起来像跨站脚本&#xff08;XSS&#xff09;&…

数据结构和算法:动态规划

初探动态规划 动态规划&#xff08;dynamic programming&#xff09;是一个重要的算法范式&#xff0c;它将一个问题分解为一系列更小的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率。 例题&#xff1a;爬楼梯 给定一个共有 &…

电机控制专题(三)——Sensorless之有功磁链Active Flux电压模型

文章目录 电机控制专题(三)——Sensorless之有功磁链Active Flux电压模型前言理论推导仿真验证总结参考文献 电机控制专题(三)——Sensorless之有功磁链Active Flux电压模型 前言 总结下电机控制中的有功磁链Active Flux(AF)模型。 纯小白&#xff0c;如有不当&#xff0c;轻…

OpenHarmony实战开发-Web自定义长按菜单案例。

介绍 本示例介绍了给Webview页面中可点击元素&#xff08;超链接/图片&#xff09;绑定长按/鼠标右击时的自定义菜单的方案。 效果预览图 使用说明 长按Web页面中的图片或者链接元素&#xff0c;弹出自定义的Menu菜单&#xff0c;创建自定义的操作&#xff0c;如复制图片、使…

【NLP练习】使用Word2Vec实现文本分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、数据预处理 1. 任务说明 本次加入Word2Vec使用PyTorch实现中文文本分类&#xff0c;Word2Vec则是其中的一种词嵌入方法&#xff0c;是一种用于生成词向量…

2001-2022上市公司数字化转型数据(含原始数据+计算代码+计算结果)

2001-2022上市公司数字化转型数据&#xff08;含原始数据计算代码计算结果&#xff09; 1、时间&#xff1a;2001-2022年 2、来源&#xff1a;原始数据整理自wind 3、指标&#xff1a;证券代码、证券简称、统计截止日期、是否发生ST或*ST或PT、是否发生暂停上市、行业代码、…

戴尔电脑怎么关闭开机密码?

1.同时按键盘上是“window键”&#xff08;一般是键盘最下面一排第二个&#xff09;和“R键“&#xff0c;并在弹出的窗口输入“netplwiz”然后确定。 2.然后会弹出的“用户账户”窗口&#xff0c;接下来取消勾选“要使用本计算机&#xff0c;用户必须输入用户名和密码” 3.上面…

每日算法练习(1)

开一个新坑&#xff0c;记录下自己每天的算法练习&#xff0c;希望自己通过1个多月的学习&#xff0c;能够成为算法大神。 下面正式开始新坑。 两个数组的交集 这是牛客上的题&#xff0c;根据题意&#xff0c;我们有多种解法&#xff0c;这题用哈希比较好写。我们可以弄一个…

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升&#xff0c;许多编程语言也纷纷效仿&#xff0c;Java 也不例外。 另一边&#xff0c;尽管社区内部问题重重&#xff0c;但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的&#xff1a;Rust 的编译器让开发人员避免了各种问题。编译器对…

【GlobalMapper精品教程】074:从Lidar点云创建3D地形模型

本文基于地形点云数据,基于泊松方法、贪婪三角形测量方法和阿尔法形状创建3d地形模型。 文章目录 一、加载地形点云数据二、创建三维地形模型1. 泊松方法2. 贪婪三角形测量方法3. 阿尔法形状注意事项一、加载地形点云数据 加载配套案例数据包中的data074.rar中的地形点云数据…

3D地图大屏 附源码(Three.js + Vue3)

目录 &#x1f44b; 前言 &#x1f680; 项目包 ⚒️ 字体制作 &#x1f310; 地图制作 &#x1f4a1; 参考视频 & 项目 开源项目&#xff08;Vue3tsWindcssEchartThree.js大屏案例&#xff09; 开源&#xff08;教程&#xff09; UI风格学习&#xff08; www.shuzixs.com …

java调用讯飞星火认知模型

前往讯飞开发平台选择产品&#xff0c;获取appId、apiKey、APISecret&#xff0c;这里我选择的是v3.0模型。 java后端实现 本项目以及实现了基本的会话功能&#xff0c;小伙伴可以自己扩充其他的例如绘画功能。 注意&#xff1a;星火模型的api使用的是websocket协议&#xf…

c 多文件编程

1.结构目录 声明类:用于声明方法,方便方法管理和调用&#xff1b; 实现类:用于实现声明的方法; 应用层:调用方法使用 写过java代码的兄弟们可以这么理解&#xff1a; 声明类 为service层 实现类 为serviceimpl层 应用层 为conlloter层 2.Dome 把函数声明放在头文件xxx.h中&…

与上级意见不合时如何恰当地表达自己的观点?

在工作中与上级意见不合时&#xff0c;恰当表达自己的观点并寻求共识是一个需要谨慎处理的问题。以下是一些建议&#xff1a; 1. **尊重与礼貌**&#xff1a;在任何情况下&#xff0c;都应保持对上级的尊重和礼貌。即使在意见不合时&#xff0c;也要避免情绪化&#xff0c;保持…

200页图解国标《数据分类分级规则》正式稿,强化重要数据识别

GB/T 43697-2024《数据安全技术 数据分类分级规则》正式稿发布&#xff0c;并于2024年10月1日实施。2024年4月17日&#xff0c;国家标准全文公开系统公布了国标最终版。《数据分类分级规则》是全国网安标委更名后&#xff0c;发布的第一部以“数据安全技术”命名的国家标准&…

Python-VBA函数之旅-enumerate函数

目录 1、enumerate函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 enumerate函数在Python中是一个强大的内置函数&#xff0c;用于将一个可迭代对象转换为一个索引序列&#xff0c;同时返…

java-spring 图灵 04 doscan

01.本次的重点依旧是扫描函数&#xff0c;这次是spring中的源码&#xff1a; 02.第一步&#xff0c;构造AnnotationConfigApplicationContext 主方法&#xff1a; public static void main(String[] args) {// 创建一个Spring容器AnnotationConfigApplicationContext applica…

C#基础|Debug程序调试学习和技巧总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 在程序的开发过程中&#xff0c;可能绝大部分时间是用来调试程序&#xff0c; 当完成了某个功能的编程&#xff0c;都需要调试一下程序&#xff0c;看编程是否存在问题。 01 为什么需要程序调试 无论是电气工程师还…