NIO和BIO如何影响应用程序的设计-数据处理
使用纯粹的 NIO设计相较 BIO设计,数据处理也受到影响。
在 BIO设计中,我们从 InputStream或 Reader逐字节读取数据。假设你正在处理一基于行的文本数据流,例如:
有如下一段文本:
Name:Tom
Age:18
Email:
tom@qq.com
Phone:13888888888
该文本行的流可以这样处理:
FileInputStream input = new FileInputStream("d://info.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String nameLine = reader.readLine();
String ageLine = reader.readLine();
String emailLine = reader.readLine();
String phoneLine = reader.readLine();
请注意处理状态由程序执行多久决定。换句话说,一旦 reader.readLine()方法返回,你就知道肯定文本行就已读完,readline()阻塞直到整行读完,这就是原因。你也知道此行包含名称;同样,第二个 readline()调用返回的时候,你知道这行包含年龄等。正如你可以看到,该处理程序仅在有新数据读入时运行,并知道每步的数据是什么。一旦正在运行的线程已处理过读入的某些数据,该线程不会再回退数据(大多如此)。下图也说明了这条原则:
(Java BIO: 从一个阻塞的流中读数据) 而一个NIO 的实现会有所不同,下面是一个简单的例子:
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
注意第二行,从通道读取字节到ByteBuffer。当这个方法调用返回时,你不知道你所需的所有数据是否在缓冲区内。你所知道的是,该缓冲区包含一些字节,这使得处理有点困难。
假设第一次read(buffer)调用后,读入缓冲区的数据只有半行,例如,“Name:An”,你能处理数据吗?显然不能,需要等待,直到整行数据读入缓存,在此之前,对数据的任何处理毫无意义。
所以,你怎么知道是否该缓冲区包含足够的数据可以处理呢?好了,你不知道。发现的方法只能查看缓冲区中的数据。其结果是,在你知道所有数据都在缓冲区里之前,你必须检查几次缓冲区的数据。这不仅效率低下,而且可以使程序设计方案杂乱不堪。例如:
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
while(!bufferFull(bytesRead)) {bytesRead = inChannel.read(buffer);
}
bufferFull()方法必须跟踪有多少数据读入缓冲区,并返回真或假,这取决于缓冲区是否已满。换句话说,如果缓冲区准备好被处理,那么表示缓冲区满了。
bufferFull()方法扫描缓冲区,但必须保持在bufferFull()方法被调用之前状态相同。如果没有,下一个读入缓冲区的数据可能无法读到正确的位置。这是不可能的,但却是需要注意的又一问题。
如果缓冲区已满,它可以被处理。如果它不满,并且在你的实际案例中有意义,你或许能处理其中的部分数据。但是许多情况下并非如此。下图展示了“缓冲区数据循环就绪”:
NIO和BIO如何影响应用程序的设计-数据处理相关推荐
- NIO和BIO如何影响应用程序的设计
无论您选择 BIO或 NIO工具箱,可能会影响您应用程序设计的以下几个方面: A.对 NIO或 BIO类的 API调用. B.数据处理逻辑. C.用来处理数据的线程数.
- NIO和BIO如何影响应用程序的设计-设置处理线程数
NIO 可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂. 如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数 ...
- NIO和BIO如何影响应用程序的设计-API调用
当然,使用 NIO的 API调用时看起来与使用 BIO时有所不同,但这并不意外,因为并不是仅从一个 InputStream逐字节读取,而是数据必须先读入缓冲区再处理.
- java中的NIO,BIO,AIO
IO,input和output,Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中. IO是什么?为什么需要IO? java在1.4之前,提供的是BIO,也就是ja ...
- java mysql aio_Java中的NIO,BIO,AIO分别是什么
Java中的NIO,BIO,AIO分别是什么 BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开 ...
- nio和bio的原理_Java的BIO,NIO和AIO的区别于演进
前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...
- NIO和BIO和AIO区别
这里写目录标题 tcp/ip协议: 三次握手和四次分手名词解释: http与tcp/ip协议的区别: NIO和BIO和AIO区别: NIO的三大核心组件关系 Channel Buffer buffer ...
- Java中nio、bio和aio的区别
前言:IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO.现在使用NIO的场景越来越多,很多网上的技术框架或多或少用到了NIO技术,譬如Tomcat.Jetty,还有基于 ...
- 分别基于IO、NIO、Netty的Java网络程序
分别基于IO.NIO.Netty的Java网络程序 IDE:IntelliJ IDEA 文章目录 分别基于IO.NIO.Netty的Java网络程序 一.Java NIO 1.1 NIO与传统IO对比 ...
最新文章
- 【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合
- elasticsearch使用bulk实现批量操作
- J2EE从servlet开始
- Apache Common HttpClient使用之七种武器
- 统计rgb与yuv文件中各分量的熵
- python的应用包括哪些_Python应用领域有哪些?
- python实现面部特效_Python实现在线批量美颜功能过程解析
- layer弹窗内容显示不全的解决方法
- php区块链开发游戏,php程序员如何开发区块链、以太坊、智能合约的教程
- 2022全新车型汽车配置参数数据库大全
- Windows11快捷键大全 win11常用快捷键介绍
- 【定义】三角形行列式和对角行列式
- android手机做路由器,怎么让手机变成wifi路由器?一招搞定!
- forge 服务器 优化,[FO]难以置信的优化 (Fabulously Optimized)
- 小米申请注册多个 “铁蛋”商标
- Python : UnicodeEncodeError: 'gbk' codec can't encode character '\u200b' in position
- 4点技巧教你如何正确管理多个微信群
- 5G网络切片的七种武器(三)
- jsp实现页面跳转的几种常用方式
- ppt是计算机图形图像设计吗,PS计算机图形图像设计ppt
热门文章
- 无法显示 xml 页 解决方案
- 全排列算法原理和实现
- 简单的 php 防注入、防跨站 函数
- [eslint-plugin-vue] [vue/no-unused-vars] 'scope' is defined but never used.
- C#实现二叉树--二叉链表结构
- jquery ajax请求 清除缓存
- ubuntu下查询SSH状态和安装SSH服务
- 密钥登陆Linux服务器
- 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)...
- 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope