NIO - 三大组件
NIO 概述
NIO有三个核心组件:
- 通道(Channels)
- 缓存(Buffers)
- 选择器(Selectors)
实际上,NIO的组件和类远不止这三个,但这个三个组件是核心。至于其它组件,例如Pipe和FileLock只不过是围绕在三大核心组件旁的实用工具类。因此,本文将重点关注这三个组件。其它组件也会在本系列其它相应的文章里介绍。
通道和缓存
在NIO里,所有IO都是从通道开始的。通道和流有点相似,可以将数据从通道读入缓存,也可以将数据从缓存写入通道,图示如下:
通道和缓存都有多种类型,下面是NIO主要的通道类型列表:
- FileChannel 文件通道
- DatagramChannel 数据报通道
- SocketChannel socket通道
- ServerSocketChannel serversocket通道
如你所见,这些通道涵盖了网络IO(包括UDP和TCP)和文件IO。除此之外还有一些有意思的接口,限于篇幅,本文不提及,但在本系列相关文章将做详述。
NIO主要的缓存类型如下:
- ByteBuffer 字节缓存
- CharBuffer 字符缓存
- DoubleBuffer 双精度浮点类型缓存
- FloatBuffer 单精度浮点类型缓存
- IntBuffer 整型缓存
- LongBuffer 长整型缓存
- ShortBuffer 短整型缓存
这些缓存涵盖了你可以通过IO发送的基本数据类型:byte, short, int, long, float, double 和 char。此外,还有 MappedByteBuffer (映射字节缓存)可用来处理内存映射文件(memory mapped files),此文也不作详述。
选择器
选择器允许单线程处理多个通道,这在当程序开了很多通道连接,但每个通道连接的通信量都不大时(比如说聊天服务器)使用起来很方便。下面是单个线程使用选择器来管理三个通道的示意图:
使用选择器时,首先要将通道注册到选择器,然后调用选择器的select()方法,这个方法会一直阻塞,直到有一个注册了的通道准备就绪触发事件。一旦select()方法返回,线程就可以处理这些事件,诸如连接接入、数据到达等事件。
完整教程
NIO - 三大组件的更多相关文章
- NIO三大组件简介
NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...
- 第一章 java nio三大组件与使用姿势
本案例来源于<netty权威指南> 一.三大组件 Selector:多路复用器.轮询注册在其上的Channel,当发现某个或者多个Channel处于“就绪状态”后(accept接收连接事件 ...
- Java NIO 三大组件之 Buffer
NIO大三组件 之Buffer 一.什么是Buffer Buffer是用于特定原始类型的数据的容器. 它的实质就是一组数组,用于存储不同类型的数据. 二.缓冲区的类型 缓冲区类型除了Boolean值类 ...
- Java NIO 三大组件之 Channel
Java NIO 之 Channel 一.什么是Channel Channel用于源节点(例如磁盘)与目的节点的连接,它可以进行读取,写入,映射和读/写文件等操作. 在Java NIO中负责缓冲区中数 ...
- NIO三大组件之Buffer
什么是Buffer Buffer(这里并不是特指Buffer类)是一个存储数据的容器,与数组类似(其实底层依旧是用数组的结构来存储数据),但不同的是,Buffer对象提供了一组更有效的方法去进行写入和 ...
- NIO三大组件之Selector选择器
什么是选择器 选择器的作用是完成IO的多路复用.一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况.选择器和通道的关系,是监控和被监控的关系. 使用 重要的成员 Selec ...
- Netty学习笔记(1)NIO三大组件
1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...
- 深入理解NIO(一)—— NIO的简单使用及其三大组件介绍
深入理解NIO(一)—— NIO的简单使用及其三大组件介绍 深入理解NIO系列分为四个部分 第一个部分也就是本节为NIO的简单使用(我很少写这种新手教程,所以如果你是复习还好,应该不难理解这篇,但如果 ...
- Netty初见-三大组件-简单使用
Netty系列文章目录 Netty初见-三大组件-简单使用 文件编程-更新中---- 目录 Netty系列文章目录 三大组件 Channel与Buffer Selector 简单使用(ByteBuff ...
随机推荐
- 2018年美国大学生数学建模竞赛(MCM/ICM) A题解题思路
- python自动化17-JS处理滚动条
前言 selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候 ...
- 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效
一般是在本地调试cookie,无论使用jquery cookie插件还是js原生态cookie方法,在谷歌浏览器chrome中都不生效,这是什么原因? 原因是: chrome不支持js在本地操作coo ...
- MySQL(MariaDB)基础之一:编译安装
一.cmake介绍 cmake的重要特性之一是其独立于源码的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译影响,因此在同一个源码树上可以进行多次不同 ...
- javascript this(上)
javascript的this指向的是一个函数运行时动态绑定对象. this的4种常见的指向: 作为对象的方法调用 var obj={ name:"姚小白", getName:fu ...
- SQLMAP学习笔记1 access注入
SQLMAP学习笔记1 access注入 Sqlmap是开源的自动化SQL注入工具,由Python写成,具有如下特点: 完全支持MySQL.Oracle.PostgreSQL.Microsoft S ...
- shell小记
1.以#!/bin/bash 开头2.执行方式 bash sh ./ `script`3.变量: 系统变量 自定义变量 --->export 可导出为全局环境变量 set显示所 ...
- 从汉诺塔游戏理解python递归函数
汉诺塔游戏规则: 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,现在把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方 图 ...
- 9.Hive Metastore Administration
前言metastore参数metastore的基本参数metastore的额外参数客户端参数使用zk自动发现mestastore启动hive metastore服务 前言 本节讲metastore相关 ...
- vim 多个文件切换 :b 命令
MiniBufExplorer插件的使用 博客分类: vim vimMiniBufExplorer 快速浏览和操作Buffer -- 插件: MiniBufExplorer 下载地址 [http:// ...