使用纯粹的 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如何影响应用程序的设计-数据处理相关推荐

  1. NIO和BIO如何影响应用程序的设计

    无论您选择 BIO或 NIO工具箱,可能会影响您应用程序设计的以下几个方面: A.对 NIO或 BIO类的 API调用. B.数据处理逻辑. C.用来处理数据的线程数.

  2. NIO和BIO如何影响应用程序的设计-设置处理线程数

    NIO 可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂. 如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数 ...

  3. NIO和BIO如何影响应用程序的设计-API调用

    当然,使用 NIO的 API调用时看起来与使用 BIO时有所不同,但这并不意外,因为并不是仅从一个 InputStream逐字节读取,而是数据必须先读入缓冲区再处理.

  4. java中的NIO,BIO,AIO

    IO,input和output,Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中. IO是什么?为什么需要IO? java在1.4之前,提供的是BIO,也就是ja ...

  5. java mysql aio_Java中的NIO,BIO,AIO分别是什么

    Java中的NIO,BIO,AIO分别是什么 BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开 ...

  6. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进

    前言 Java里面的IO模型种类较多,主要包括BIO,NIO和AIO,每个IO模型都有不一样的地方,那么这些IO模型是如何演变呢,底层的原理又是怎样的呢? 本文我们就来聊聊. BIO BIO全称是Bl ...

  7. NIO和BIO和AIO区别

    这里写目录标题 tcp/ip协议: 三次握手和四次分手名词解释: http与tcp/ip协议的区别: NIO和BIO和AIO区别: NIO的三大核心组件关系 Channel Buffer buffer ...

  8. Java中nio、bio和aio的区别

    前言:IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO.现在使用NIO的场景越来越多,很多网上的技术框架或多或少用到了NIO技术,譬如Tomcat.Jetty,还有基于 ...

  9. 分别基于IO、NIO、Netty的Java网络程序

    分别基于IO.NIO.Netty的Java网络程序 IDE:IntelliJ IDEA 文章目录 分别基于IO.NIO.Netty的Java网络程序 一.Java NIO 1.1 NIO与传统IO对比 ...

最新文章

  1. 【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合
  2. elasticsearch使用bulk实现批量操作
  3. J2EE从servlet开始
  4. Apache Common HttpClient使用之七种武器
  5. 统计rgb与yuv文件中各分量的熵
  6. python的应用包括哪些_Python应用领域有哪些?
  7. python实现面部特效_Python实现在线批量美颜功能过程解析
  8. layer弹窗内容显示不全的解决方法
  9. php区块链开发游戏,php程序员如何开发区块链、以太坊、智能合约的教程
  10. 2022全新车型汽车配置参数数据库大全
  11. Windows11快捷键大全 win11常用快捷键介绍
  12. 【定义】三角形行列式和对角行列式
  13. android手机做路由器,怎么让手机变成wifi路由器?一招搞定!
  14. forge 服务器 优化,[FO]难以置信的优化 (Fabulously Optimized)
  15. 小米申请注册多个 “铁蛋”商标
  16. Python : UnicodeEncodeError: 'gbk' codec can't encode character '\u200b' in position
  17. 4点技巧教你如何正确管理多个微信群
  18. 5G网络切片的七种武器(三)
  19. jsp实现页面跳转的几种常用方式
  20. ppt是计算机图形图像设计吗,PS计算机图形图像设计ppt

热门文章

  1. 无法显示 xml 页 解决方案
  2. 全排列算法原理和实现
  3. 简单的 php 防注入、防跨站 函数
  4. [eslint-plugin-vue] [vue/no-unused-vars] 'scope' is defined but never used.
  5. C#实现二叉树--二叉链表结构
  6. jquery ajax请求 清除缓存
  7. ubuntu下查询SSH状态和安装SSH服务
  8. 密钥登陆Linux服务器
  9. 安卓开发笔记——关于图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)...
  10. 1spring注解:@Configuration,@Bean,@ComponentScan(),@Scope