Android NIO 系列教程(一) NIO概述
系列文章:
系列文章:
Android NIO 系列教程(一) NIO概述
Android NIO 系列教程(二) – Channel
Android NIO 系列教程(三) – Buffer
Android NIO 系列教程(四) – Selector
Android NIO 系列教程(五) – FileChannel
Android NIO 系列教程(六) – SocketChannel
Android NIO 系列教程(七) – ServerSocketChannel
Android NIO 系列教程(八) --NIO简易聊天室
根据 英语原文 翻译过来,添加自己一些理解,英语好的,也可以直接阅读原文。
在 Socket 的教程 Android Socket 系列更新计划中,我们已经学习了 Socket 的基本使用和一些案例;但在多人聊天室中,我们已经知道,在百万级别的客户端连接时,无论服务端怎么优化,线程和IO阻塞问题已经存在;
一、NIO介绍
所以,这里我们学习一下 JDK1.4之后引入的非阻塞 IO – NIO;他们的区别如下:
- 阻塞与非阻塞: 传统 IO 在读写时是阻塞的,即当我们在 write 或者 read 的时候,线程是阻塞的,在此期间,线程不能做其他事,直到文件的字节被全部读取完成,线程才回复空闲状态。而非阻塞则表示请求一个数据写入通道,在其期间线程还能去处理其他事,大大增大了线程的利用率;
- 面向对象不同:传统IO面向字节流,而NIO则面向缓冲流;Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区;NIO则不同,在读写时数据存在一个 buffer 缓冲区中,可以前后移动,处理数据时只需要处理Buffer的数据即可,大大增大了灵活性。
- Selectors:相较于传统IO,NIO 由 Selector 选择器来处理事物;即用一个线程来监视多路通道,大大减少了线程开销;后面介绍NIO模式,我们再来讨论 selector 。
Java NIO 由以下核心部分组成:
- Channel
- Buffer
- Selectors
1.1、Channel & Buffer
基本上,所有NIO的IO都从一个 Channel 通道开始的,Channel 有点像流,可以从一个 Channel 读取数据到Buffer,也可以从Buffer 读数据到 Channel,如下图:
Channel 的种类有以下几种,包含了 TCP+UDP,网络和文件类型:
- FileChannel
- DatagramChannel
- SocketChannel
- ServerSocketChannel
Buffer 的类型包含以下几种基础类型:
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
Java 的NIO还包含 MappedByteBuffer , 用于内存映射,这里没用到,就不先讨论了。
1.2、Selectors
Selectors 允许单个线程处理多个Channel ,如果你的app打开了多个连接,但每个连接的流量都很低的情况下,使用 selector 是个不错的选择,比如聊天室。
下面是是一个 selector 连接 三个 channel 的案例:
使用 selector 之前,得向 selector 注册 channel,然后调用它的 select() 方法;该方法会一直阻塞,直到有注册channel准备就绪,一旦该方法有返回事件,则该线程就可以去处理这些事件,包括新连接、数据接收等。
相关文章
- Android 线程 thread 两种实现方法
- Android快速发布项目到jcenter
- Android中的Handler的机制与用法详解
- Android+struts2+json方式模拟手机登录功能
- Android framework有多重要!学懂了至少15K(经验总结+内核解析 附源码)
- 谈论flutter和jetpack compose学习优先级的背后,Android开发有着怎样的一套进阶逻辑?
- Android应用程序“.R文件”消失怎么办
- [Java][Android][Process] Process 创建+控制+分析 经验浅谈
- Android--调用系统照相机拍照与摄像
- Android屏幕适配全攻略(最权威的官方适配指导)
- Android端WEEX + HTTPDNS 最佳实践
- android优化(json工具,message新建/传递,avtivity深入学习视频)
- 【android-tips】installfailedinsufficientstorage解决方案
- androidstudio无法真机安装debug包 android无法安装debug包 oppo vivo
- Android 协调者布局:ConstraintLayout Barrier
- android开发之使用上下文菜单
- Android平台一款UI体验好于NumberPicker的自定义控件NumberPickerView
- Android NIO 系列教程(八) --NIO简易聊天室
- Android NIO 系列教程(六) -- SocketChannel
- Android开发之LinearLayout布局
- 【Android 安装包优化】使用 lib7zr.a 静态库处理压缩文件 ( 交叉编译 lib7zr.a 静态库 | 安卓工程导入静态库 | 配置 CMakeLists.txt 构建脚本 )