系统学习NIO
概述
详细
一、前言
本例子用于系统学习nio, 在介绍nio知识点过程中中, 使用以下案例
1:传统IO与NIO 代码对比与分析
2:NIO操作原理(例子:火车、车轨与车厢的举例)
3:使用NIO实现文件拷贝
4:使用NIO实现非阻塞是socket通讯
二、代码结构图
1、代码导入
下载代码导入sts编辑器,如果没有sts也可以直接导入到eclipse或者idea
2、代码结构图
三、项目运行
代码使用的junit4单元测试, 只需要代码每一个测试类, 选中要执行的方法右键运行:run as JunitTest即可。
安装学习步骤:
1>打开BufferTest类, 先执行test1方法
目的:学习nio的核心之一Buffer模块的常见api
运行效果:
2>打开ChannelTest类, 按照顺序, 先后运行test1, test2, test3, test4, test5方法
目的:学习nio核心之一Channel 的获取方式, 操作方式, 案例是文件拷贝
1:先准备一个a.avi文件
2:右键运行
3:运行结果, 多了b.avi文件, 拷贝成功
3>SelectorTest 跟 PipeTest 同理, 具体实现功能在注释已经解释。
四、项目相关资料
图片:
思维导图:
五、核心知识点解释
传统IO: 就是jdk纯原生的IO操作
NIO: jdk1.4 之后提供的新的io操作, 可以异步读取数据, 可以双向读取流
缓存区:nio 核心之一, nio操作的数据暂存在缓存区中,具体操作参考:BufferTest 类
通道:nio核心之一, nio通过缓存区操作数据, 而数据的读与写的流转需要借助通道实现。 具体操作参考:ChannelTest
选择器:nio核心之一, nio为解决非阻塞读写问题,而提出通过事件响应方式实现io操作, 选择器是其中核心组件。具体操作参考:SelectorTest类
网络IO:就是socket操作, 具体操作参考:SelectorTest类
六、部分源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | /** * 一:缓冲区:负责数据的存取,缓冲区本质是一个数组,用于存储不同类型的数据 * 根据数据类型不同(boolean除外),通过了7个缓冲区: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuffer * FloatBuffer * DoubleBuffer * * 二:缓冲区存储数据2种核心方法 * put(): 存入数据到缓冲区中 * get(): 获取缓冲区中的数据 * * * * 三:缓冲区中四大核心属性 * capacity:容量,表示缓冲区中最大的存储数据的容量,一旦声明不能改变 * limit:界限,表示缓冲区中可以操作数据的大小.(limit后面数据无法进行读写) * position:位置,表示缓冲区中正在操作数据的位置 * mark:标记,表示标记当前position的位置,可以通过reset() 回复到mark的位置 * * 约束: * position <= limit <= capacity * * */ public class BufferTest { @Test public void test2() throws Exception { //1:分配空间 ByteBuffer buffer = ByteBuffer.allocateDirect( 1024 ); //2:判断是否是直接缓冲区 buffer.isDirect(); } @Test public void test1() throws Exception { String str = "dafei" ; //1:分配一个指定大小的缓冲区 ByteBuffer buf = ByteBuffer.allocateDirect( 1024 ); System.out.println( "-----------allocate----------------" ); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //2:往缓冲区中存储数据 buf.put(str.getBytes()); System.out.println( "----------put----------------" ); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //3:切换读模式 buf.flip(); System.out.println( "----------flip----------------" ); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); //4:获取缓冲区存放的数据 System.out.println(buf.get()); System.out.println(buf.get()); System.out.println( "----------get----------------" ); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); System.out.println( "----------get----------------" ); buf.rewind(); buf.remaining(); System.out.println(buf.capacity()); System.out.println(buf.limit()); System.out.println(buf.position()); } } |
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?