不懂就背--Java中的IO和NIO相关知识点总结

2023-11-02

一、IO和NIO的概念

NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。
在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

二、NIO和IO的主要区别

下表总结了Java IO和NIO之间的主要区别:

IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
选择器

1、什么是面向流与面向缓冲?

在Java IO中读取数据和写入数据是面向流(Stream)的,这表示当我们从流中读取数据,写入数据时也将其写入流,流的含义在于没有缓存 ,就好像我们站在流水线前,所有的数据沿着流水线依次到达我们的面前,我们只能读取当前的数据(相当于我们拥有一个数据流的切面)。如果需要获取某个数据的前一项或后一项数据那就必须自己缓存数据,而不能直接从流中获取(因为面向流就意味着我们只有一个数据流的切面)

而在Java NIO中数据的读写是面向缓冲区(Buffer)的,读取时可以将整块的数据读取到缓冲区中,在写入时则可以将整个缓冲区中的数据一起写入。这就好像是将流水线传输变成了卡车运送,面向流的数据读写只提供了一个数据流切面,而面向缓冲区的IO则使我们能够看到数据的上下文,也就是说在缓冲区中获取某项数据的前一项数据或者是后一项数据十分方便
这种便利是有代价的,因为我们必须管理好缓冲区,这包括不能让新的数据覆盖了缓冲区中还没有被处理的有用数据;将缓冲区中的数据正确的分块,分清哪些被处理过哪些还没有等等。

2、那什么是阻塞与非阻塞IO?

Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了
Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。它是利用事件驱动机制,而不是监听机制,事件到的时候再触发。NIO线程之间通过wait,notify等方式通讯。保证了每次上下文切换都有意义,减少无谓的进程切换。
线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

3、什么是选择器?(Selectors)

Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

三、NIO和IO如何影响应用程序的设计

无论您选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:

1.对NIO或IO类的API调用。
2.数据处理。
3.用来处理数据的线程数。

四、总结

NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。

如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。一个线程多个连接的设计方案如下图所示:

Java NIO: 单线程管理多个连接

如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:

Java IO: 一个典型的IO服务器设计- 一个连接通过一个线程处理.

Java IO 工作流程

由于Java IO是阻塞的,所以当面对多个流的读写时需要多个线程处理。例如在网络IO中,Server端使用一个线程监听一个端口,一旦某个连接被accept,创建新的线程来处理新建立的连接。
Java IO
在这里插入图片描述
其中 read/write 是阻塞的。

Java NIO 工作流程

Java NIO 提供 Selector 实现单个线程管理多个channel的功能。
Java NIO
在这里插入图片描述
其中select 调用可能是阻塞的,也可以是非阻塞的。但是read/write是非阻塞的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不懂就背--Java中的IO和NIO相关知识点总结 的相关文章

随机推荐

  • C++_从流(stream)向文件保存多个数组的元素

    本文的目的是为了介绍如何将多个具有相同结构的数组元素 保存进一个txt文件中 float x 50 一大堆元素 float y 50 一大堆元素 float Z 50 一大堆元素 float w 50 一大堆元素 此处我想把几组数组内的值
  • GPSD如何设置固定波特率

    Gpsd设置固定波特率 修改 etc init d gpsd 支持 etc init d gpsd start stop restart bin sh BEGIN INIT INFO Provides gpsd Required Start
  • 【项目实战】基于Python实现时间序列分析建模(ARIMA模型)项目实战

    说明 这是一个机器学习实战项目 附带数据 代码 文档 代码讲解 如需数据 代码 文档 代码讲解可以直接到文章最后获取 1 项目背景 当今世界正处于一个数据信息时代 随着后续互联网的发展各行各业都会产生越来越多的数据 包括不限于商店 超市 便
  • 电子科技大学人工智能期末复习笔记(四):概率与贝叶斯网络

    目录 前言 概率 概率公式 贝叶斯公式 链式条件概率 例题 1 求联合概率分布 边缘概率分布 条件概率分布 2 灵活运用贝叶斯公式 概率总结 贝叶斯网络 判断独立性 两个事件独立的判断 条件独立性的判断 假设条件独立的链式法则 Active
  • RMAN删除过期的归档日志

    用rman进入把归档日志删除 1 命令 gt rman target 2 命令 gt crosscheck archivelog all 3 命令 gt delete expired archivelog all 4 命令 gt exit
  • 【LeetCode算法系列题解】第31~35题

    CONTENTS LeetCode 31 下一个排列 中等 LeetCode 32 最长有效括号 困难 LeetCode 33 搜索旋转排序数组 中等 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置 中等 LeetCod
  • 代理IP与Socks5代理:跨界电商战略的数据智慧与隐私守护

    一 代理IP 跨界电商战略的数据引擎 多地区数据采集 跨界电商需要获取各地区的市场数据和竞争情报 代理IP允许模拟不同地区的IP地址 轻松实现多地区数据采集 为决策提供多维度的数据支持 规避反爬虫机制 代理IP的IP轮换能够规避网站的反爬虫
  • 如何在eclipse开发平台上运行静态网页

    1 先打开eclipse 新建一个Static Web Project工程 如下图 2 在此工程目录下的WebContent中建一个index html文件 此文件必须是index命名 因为服务器会自动寻找工程的主页 不然会出现下图 3 在
  • 正则应用之——日期正则表达式

    1 概述 首先需要说明的一点 无论是Winform 还是Webform 都有很成熟的日历控件 无论从易用性还是可扩展性上看 日期的选择和校验还是用日历控件来实现比较好 前几天在CSDN多个版块看到需要日期正则的帖子 所以整理了这篇文章 和大
  • 魔幻矩阵全解(有全部代码说明)

    无意间看到了关于魔幻矩阵的一篇博客 感觉挺有意思的 于是便编程分别实现了三种魔幻矩阵的c程序 下面是关于魔幻矩阵的一篇很详细的解释说明 看代码之前 务必先去了解了解 http blog csdn net northwolves articl
  • 二叉树前中后层次遍历,递归实现

    文章目录 前序遍历 代码 Python 代码 C 中序遍历 代码 Python 代码 C 后序遍历 代码 Python 代码 C 层序遍历 代码 Python 代码 C 反向层序遍历 代码 Python 代码 C 总结 前序遍历 题目链接
  • Go 字符串

    Go 字符串 01 Go 字符串简介 02 Go 支持的字面值 1 解释字符串 2 非解释字符串 03 Go 字符串常用操作 1 strings 包 1 判断字符串的前缀和后缀 2 判断字符串的包含关系 3 判断子串出现的位置 索引 3 字
  • 通过 docker-compose 快速部署 DolphinScheduler 保姆级教程

    文章目录 一 概述 二 前期准备 1 部署 docker 2 部署 docker compose 三 安装 MySQL 数据库 四 安装注册中心 Zookeeper 五 Apache DolphinScheduler 编排部署 1 下载 D
  • React中 useState在合成事件中是异步的,怎么获取到useState 设置后的最新值,或者说setState中获取到最新值

    useState 在合成事件中是异步的 合成时间是什么呢 合成事件 简单来说 比如onClick 或者 onChange 或者说是 Input之类的事件 所以一个情景是这样的 当你在onClick 中这样设置了状态 并赋值上去 但是打印的值
  • R语言数据可视化---交互式图表recharts包

    作者简介Introduction 邬书豪 车联网数据挖掘工程师 人工智能爱好者社区负责人 微信ID tsaiedu 知乎专栏 https www zhihu com people wu shu hao 67 activities 往期回顾
  • SYSTEMTIME、FILEITIME、LOCLTIME、UTC、QDateTime等各种时间

    1 UTC 世界协调时间 2 LOcalTime 本地时间 也就是系统设置时区的当前时间 3 SYSTEMTIME 格林威治时间 由本地时间减去时区即可 与localtime都是用SYSTEMTIME结构体存储 4 FileTime 基于U
  • protobuf-jetbrains-plugin插件

    ProtoBuf简介 ProtoBuf 是结构数据序列化方法 可简单类比于 XML 其具有以下特点 语言无关 平台无关 即 ProtoBuf 支持 Java C Python 等多种语言 支持多个平台 高效 即比 XML 更小 3 10倍
  • linux 命令:tr 详解

    tr 命令的功能是转换或删除字符 用法 tr OPTION SET1 SET2 选项 c C complement 用 SET2 替换 SET1 中没有包括的字符 d delete 删除 SET1 中的字符 s squeeze repeat
  • t420i升级固态硬盘提升_升级旧机子,为何首选升级固态硬盘?

    哈喽 带噶好 今天我们来聊聊升级老旧机器 为啥先升级固态硬盘 而不是升级内存 CPU 显卡之类的硬件 固态硬盘 是最近这五六年才开始普及开来的物件 所以很多人家里使用的主机 如果是五六年前买的话 机箱里大概率装的是机械硬盘 机械硬盘开机什么
  • 不懂就背--Java中的IO和NIO相关知识点总结

    一 IO和NIO的概念 NIO即New IO 这个库是在JDK1 4中才引入的 NIO和IO有相同的作用和目的 但实现方式不同 NIO主要用到的是块 所以NIO的效率要比IO高很多 在Java API中提供了两套NIO 一套是针对标准输入输