java nio importnew_Java NIO:NIO概述
一.NIO中的几个基础概念
在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Selector(选择器)。
1. Channel通道就是通向什么的道路,为某个提供了渠道。在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:
public classChannelTest {public static void main(String[] args) throwsIOException {
File file= new File("data.txt");
InputStream inputStream= newFileInputStream(file);byte[] bytes = new byte[1024];
inputStream.read(bytes);
inputStream.close();
}
}
这里的InputStream实际上就是为读取文件提供一个通道的。
NIO 中的Channel同传统IO中的Stream对比:
1)传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。
2)Channel是双向的,既可用来进行读操作,又可用来进行写操作。
2. Buffer(缓冲区),是NIO中非常重要的一个东西,在NIO中所有数据的读和写都离不开Buffer。比如上面的一段代码中,读取的数据时放在byte数组当中,而在NIO中,读取的数据只能放在Buffer中。同样地,写入数据也是先写入到Buffer中。
3.Selector (选择器),是NIO中最关键的一个部分,Selector的作用就是用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件然后进行处理。
比如看下面的这个例子:
用单线程处理一个Selector,然后通过Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐个地对这些事件进行响应处理。
二. Channel
在前面已经提到,Channel和传统IO中的Stream很相似。
以下是常用的几种通道:
FileChannel
SocketChanel
ServerSocketChannel
DatagramChannel
通过使用FileChannel可以从文件读或者向文件写入数据;
通过SocketChannel,以TCP来向网络连接的两端读写数据;
通过ServerSocketChanel能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的SocketChannel来进行数据读写;
通过DatagramChannel,以UDP协议来向网络连接的两端读写数据。
下面给出通过FileChannel来向文件中写入数据的一个例子:
public classTest {public static void main(String[] args) throwsIOException {
File file= new File("data.txt");
FileOutputStream outputStream= newFileOutputStream(file);
FileChannel channel=outputStream.getChannel();
ByteBuffer buffer= ByteBuffer.allocate(1024);
String string= "java nio";
buffer.put(string.getBytes());
buffer.flip();//此处必须要调用buffer的flip方法
channel.write(buffer);
channel.close();
outputStream.close();
}
}
通过上面的程序会向工程目录下的data.txt文件写入字符串”java nio”,注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容,至于具体原因将在下篇博文中具体讲述Buffer的用法时阐述。
三.Buffer
Buffer缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。具体看下面这张图就理解了:
上图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。
在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:
ByteBuffer
IntBuffer
CharBuffer
LongBuffer
DoubleBuffer
FloatBuffer
ShortBuffer
如果是对于文件读写,上面几种Buffer都可能会用到。但是对于网络读写来说,用的最多的是ByteBuffer。
四.Selector
Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。通过用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。
Selector有一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。
来自: http://www.importnew.com/17781.html
java nio importnew_Java NIO:NIO概述相关推荐
- 【Java】BIO、NIO、AIO网络编程模型概述
前言 我们知道,UNIX环境下常见的网络I/O模型有5种: 同步阻塞 同步非阻塞 I/O复用 信号驱动 异步非阻塞 那么基于上述五种模型,Java中,随着NIO和AIO(NIO 2.0)的引入,一般具 ...
- java 网络编程和NIO
1.软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构.常见程序有QQ.迅雷等软件. 特点: 客户端和服务器是分开的,需要下载客户端,对网络要求相对低, 服务器压力小 ...
- java nio 李林峰_浅谈Java中BIO、NIO和AIO的区别和应用场景
最近一直在准备面试,为了使自己的Java水平更上一个档次,拜读了李林峰老师的<Netty权威指南>,了解了Java关于IO的发展和最新的技术,真是受益匪浅,现在把我总结的关于BIO.NIO ...
- 常见的 IO 模型有哪些?Java 中 BIO、NIO、AIO 的区别?
IO 模型这块确实挺难理解的,需要太多计算机底层知识.写这篇文章用了挺久,就非常希望能把我所知道的讲出来吧!希望朋友们能有收货!为了写这篇文章,还翻看了一下<UNIX 网络编程>这本书,太 ...
- Java之IO,BIO,NIO,AIO
2019独角兽企业重金招聘Python工程师标准>>> 参考文献一 IO基础知识回顾 java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中I ...
- bio linux 创建_不断升级,Java之BIO、NIO、AIO的演变
一.前言 一句话概括BIO NIO AIO: 第一阶段,服务端采用同步阻塞的BIO: 第二阶段,服务端采用同步阻塞的线程池的BIO: 第三阶段,JDK4之后服务端采用同步非阻塞的NIO: 第四阶段,J ...
- Java 7:使用NIO.2进行文件过滤–第2部分
大家好. 这是使用NIO.2系列进行文件过滤的第2部分. 对于那些尚未阅读第1部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以 ...
- Java 7:使用NIO.2进行文件过滤–第3部分
大家好. 这是使用NIO.2系列进行文件过滤的第3部分. 对于那些尚未阅读第1 部分或第2部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新A ...
- Java 7:使用NIO.2进行文件过滤-第1部分
NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以执行与 java.io以及许多出色的功能,例如:访问文件元数据和监视目录更改等. 显然,由于向后兼容,ja ...
- Java 7:使用NIO.2进行文件过滤-第2部分
大家好. 这是使用NIO.2系列进行文件过滤的第2部分. 对于那些尚未阅读第1部分的人 ,这里有个回顾. NIO.2是自Java 7起JDK中包含的用于I / O操作的新API.使用此新API,您可以 ...
最新文章
- 【numpy学习笔记】数组的切片,索引,迭代
- 小谈EntityFramwork Code First实体更新后的数据库处理
- x+2y+3z=n的非负整数解数
- 文件加载顺序_Springboot配置文件存放位置及读取顺序
- 【HDU - 2104】hide handkerchief (素数)
- 用Python及深度学习实现iPhone X的FaceID功能
- 计算机组成原理 中央处理器(CPU) 指令系统
- Python天气预报查询
- 用js来实现那些数据结构01(数组篇01-数组的增删)
- 人脸方向学习(四):人脸关键点检测+Mobilenet_v3结构探索
- python 输出函数表达式——LaTeX数学公式
- python pandas 之drop()函数
- 清明上河图对计算机技术的启发,走进清明上河图沉浸式数字音画项目在京发布-微软亚洲研究院.PDF...
- EBS系统常见问题与故障
- 璞华hawkeye点巡检设备平台系统
- BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现
- 马一篇知乎大佬的诠释
- 使用JS解析JSON数组
- 计算机信息安全技术知识点简摘又名我的期末考试复习第一弹
- pca图解读_利用R绘制PCA分析图(2)