(一:NIO系列)JAVA NIO 简介
出处:JAVA NIO 简介
Java 中 New I/O类库 是由 Java 1.4 引进的异步 IO。由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O)。
NIO弥补了原来同步阻塞I/O的不足,它在标准Java代码中提供了高速的、面向块的I/O。
Java NIO 由以下几个核心部分组成:
Channel
Buffer
Selector
1.1. NIO 和 OIO 的对比
旧的IO(OIO) 和 NIO 的区别主要体现在三个方面:
(1)OIO 基于流(Stream oriented),而 NIO 基于 Buffer (Buffer oriented);
(2)OIO 操作是阻塞的,而 NIO 操作是非阻塞的;
(3)OIO 没有 selector 概念,而 NIO 有 selector 概念.
旧的IO(OIO) 是面向字节流或字符流的,在一般的OIO操作中,我们以流式的方式顺序地从一个 Stream 中读取一个或多个字节,因此,我们也就不能随意改变读取指针的位置。
而在 NIO 中,而是引入了 Channel 和 Buffer 的概念。在 NIO 中,只需要从 Channel 中读取数据到 Buffer 中,或将数据从 Buffer 中写入到 Channel。并且,不像OIO 那样是顺序操作,在NIO 中,我们可以随意地读取任意位置的数据.
1.2. 阻塞和非阻塞
在OIO中,Java 提供的各种 stream 流操作都是阻塞的,例如我们调用一个 read 方法读取一个文件的内容,那么调用 read 的线程会被阻塞住,直到 read 操作完成。
而 NIO 的非阻塞模式允许我们非阻塞地进行 IO 操作。 例如我们需要从网络中读取数据。在 NIO 的非阻塞模式中,当我们调用 read 方法时,如果此时有数据,则 read 读取并返回; 如果此时没有数据,则 read 直接返回,而不会阻塞当前线程。
NIO的非阻塞,是如何做到的呢?
使用的是通道和通道的多路复用技术。先来看通道Channel。
1.3. Channel
OIO中,通常来说,一个连接使用有两个流,一个输入流一个输出流。通过两个流不断的进行输入和输出。
与之相对应,NIO中,通常来说,一个连接就是一个通道Channel表示,所有的 NIO 的 I/O 操作都是从 Channel 开始的。 一个 channel 类似于OIO中的两个 stream的结合体。
1.4. selector
通道Channel要进行多路复用,基础就是选择器selector。
Selector是何方神圣?
这是一个IO事件的查询器,通过 Selector,一个线程可以查询多个 Channel 的 IO 事件的就绪状态。
我们要做的工作,就是将要进行状态查询的Channel(相当于流)注册到选择器Seletor中。当我们向一个 Selector 中注册了 Channel 后,Selector 内部的机制就可以自动地为我们不断地查询(select) 这些注册的 Channel 是否有已就绪的 IO 事件(例如可读,可写,网络连接完成等)。
通过这样的 Selector 机制,我们就可以很简单地使用一个线程高效地管理多个 Channel 了。
1.5. Java NIO Buffer
当我们需要与 NIO Channel 进行交互时,我们就需要使用到 NIO Buffer,即数据从 Buffer读取到 Channel 中,并且从 Channel 中写入到 Buffer 中。
Buffer的使用,也是NIO非阻塞的重要的前提和基础之一。
(一:NIO系列)JAVA NIO 简介的更多相关文章
- Java-杂项-java.nio:java.nio
ylbtech-Java-杂项-java.nio:java.nio java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有 ...
- 【Java nio】java nio笔记
缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...
- 【JAVA NIO】java NIO
本文是博主深入学习Netty前的一些铺垫,之前只是使用Netty,用的很粗暴,导包,上网找个DEMO就直接用,对Netty中的组件了解并不深入. 于是再此总结下基础,并对一些核心组件作如下记录: 1. ...
- 【NIO】Java NIO之选择器
一.前言 前面已经学习了缓冲和通道,接着学习选择器. 二.选择器 2.1 选择器基础 选择器管理一个被注册的通道集合的信息和它们的就绪状态,通道和选择器一起被注册,并且选择器可更新通道的就绪状态,也可 ...
- 【NIO】Java NIO之通道
一.前言 前面学习了缓冲区的相关知识点,接下来学习通道. 二.通道 2.1 层次结构图 对于通道的类层次结构如下图所示. 其中,Channel是所有类的父类,其定义了通道的基本操作.从 Channel ...
- 【NIO】Java NIO之缓冲
一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继 ...
- 我的Java开发学习之旅------>Java NIO 报java.nio.charset.MalformedInputException: Input length = 1异常
今天在使用Java NIO的Channel和Buffer进行文件操作时候,报了java.nio.charset.MalformedInputException: Input length = 1异常, ...
- Java入门系列Java NIO
jdk1.4中新加入的NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小.
- Java NIO 系列教程(转)
原文中说了最重要的3个概念,Channel 通道Buffer 缓冲区Selector 选择器其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞 ...
- Java NIO系列1-概观
Java NIO系列1-概观 Java NIO.中间的N你既可以理解为(new),也就是新的IO,相对于java1.5之前的IO它确实是新的;也可以理解为(no-blocking),也就是非阻塞的IO ...
随机推荐
- unigui ios微信界面错位和点击失灵问题
IOS微信下会出现二个严重问题: 1.输入框失去焦点导致控件错位,造成无点正常点击. 此问题是微信自带浏览器,一直遗留问题, 尝试了多种方法始终无解.因此要用来开发公众号的一定要注意. 2.界面下移 ...
- 阿里重磅开源全球首个批流一体机器学习平台Alink,Blink功能已全部贡献至Flink
11月28日,Flink Forward Asia 2019 在北京国家会议中心召开,阿里在会上发布Flink 1.10版本功能前瞻,同时宣布基于Flink的机器学习算法平台Alink正式开源,这也是 ...
- ORM详解,ORM Object relation mapping (对象关系映射)
- R语言预测实战(第二章--预测方法论)
2.1预测流程 从确定预测主题开始,一次进行数据收集.选择方法.分析规律.建立模型.评估效果直到发布模型. 2.2.1确定主题 (1)指标:表达的是数量特征,预测的结果也通常是通过指标的取值来体现. ...
- [CSP-S模拟测试]:排列组合(数学 or 找规律)
题目描述 $T$组数据,每次给定$n$,请求出下式的值,对$10^9+7$取模: $$C_n^0\times C_n^0+C_n^1\times C_n^1+C_n^2\times C_n^2+... ...
- 在 mac 系统上安装 python 的 MySQLdb 模块
在 mac 系统上安装 python 的 MySQLdb 模块 特别说明:本文主要参考了Mac系统怎么安装MySQLdb(MySQL-Python) 第 1 步:下载 MySQL-python-1.2 ...
- Web引用中文个性字体
最近在前端开发时,因为设计的原因,要引用一些特殊字体(otf格式),但是后来发现这些字体文件非常大,平均每个要8mb左右,严重影响了网页效率.经过一番搜索,发现了前端字体压缩工具(只支持utf-8格式 ...
- js方法返回多值如何取值demo
js方法返回,如何取值?下面demo两种方法 new array 和 json 返回值 取值示例. 方法一: new array <html> <head> <meta ...
- win7x64 串口程序无法运行,提示:component 'MSCOMM32.OCX' or one of its dependencies not correctlu registered。。。
VB写的串口工具在win7 x64机器运行时遇到的问题, component 'MSCOMM32.OCX' or one of its dependencies not correctlu regis ...
- Linux下查看分区内目录及文件占用空间容量
转载linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth=1 这个是我想要的结果 a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘 ...