Java NIO与Java BIO的区别是什么?
1、什么是Java NIO?
同步非阻塞io模式,拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
Java NIO有三大组成部分:Buffer;Channel;Selector。
通过事件驱动模式实现了什么时候有数据可读的问题。 Channel:相当于IO操作的载体,相当于一个硬件设备,一个文件,一个socket或是区别程序中的不同IO操作,如read,write。
channel类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。 通道可以异步地读写。 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。
Buffer:用于和NIO通道进行交互。如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的。 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存。 channel 和 buffer 之间的交互如下:
Selector:Selector(选择器)是Java NIO中能够检测一到多个NIO通道,通道将关心的事件注册到selector 上,selector能够知晓通道是否为这些事件诸如读写事件做好数据准备。这样,一个单独的线程可以管理多个channel,从而管理多个网络连接。
2、什么是Java BIO?
同步阻塞IO模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。不知道io操作中什么时候有数据可读,所以一直是阻塞的模式。
3、区别及应用
主要区别:
两种模式的差异对比:
首先,线程是较为重量级的资源。bio当并发量大,而后端服务或客户端处理数据慢时就会产生产生大量线程处于等待中,即上述的阻塞,是非常严重的资源浪费。
此外,线程的切换也会导致cpu资源的浪费,单机内存限制也无法过多的线程,只能单向以流的形式读取数据。
nio使用单线程或者只使用少量的多线程,多个连接共用一个线程,消耗的线程资源会大幅减小。并且当处于等待(没有事件)的时候线程资源可以释放出来处理别的请求,通过事件驱动模型当有accept/read/write等事件发生后通知(唤醒)主线程分配资源来处理相关事件。以buffer缓冲区的形式处理数据,处理更为方便。
nio server demo:
Selector selector = Selector.open();
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
ssc.socket().bind(new InetSocketAddress(port)); ssc.register(selector, SelectionKey.OP_ACCEPT); while (true) { // select()阻塞,等待有事件发生唤醒 int selected = selector.select(); if (selected > 0) { Iterator<SelectionKey> selectedKeys = selector.selectedKeys().iterator(); while (selectedKeys.hasNext()) { SelectionKey key = selectedKeys.next(); if ((key.readyOps() & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) { SocketChannel client = ((ServerSocketChannel) key.channel()).accept();// 处理 accept 事件 //注册read事件client.configureBlocking(false);client.register(key.selector(), SelectionKey.OP_READ, ByteBuffer.allocate(bufSize));} else if ((key.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) { // 处理 read 事件 //注册write事件} else if ((key.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) { // 处理 write 事件 } selectedKeys.remove(); } }
}
bio server demo:
ServerSocket serverSocket;try {serverSocket = new ServerSocket(8000);while (true){Socket socket = serverSocket.accept();new Thread(()->{try (InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()) {byte[] bytes =new byte[1024];while (inputStream.read(bytes) != -1){outputStream.write(bytes);bytes = new byte[1024];}}catch (IOException e){e.printStackTrace();}}).start();}} catch (IOException e) {e.printStackTrace();}}
4、Java学习视频
Java基础:
Java300集,Java必备优质视频_手把手图解学习Java,让学习成为一种享受
Java项目:
【Java游戏项目】1小时教你用Java语言做经典扫雷游戏_手把手教你开发游戏
【Java毕业设计】OA办公系统项目实战_OA员工管理系统项目_java开发
Java NIO与Java BIO的区别是什么?相关推荐
- Java NIO框架(Java编程)
Java NIO框架 MINA 用netty性能和链接数.并发等压力测试参数好于mina 1.NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O 原力的I/O库与NIO最 ...
- Java IO框架之BIO、NIO、AIO
我是傲骄鹿先生,沉淀.学习.分享.成长. 如果你觉得文章内容还可以的话,希望不吝您的「一键三连」,文章里面有不足的地方希望各位在评论区补充疑惑.见解以及面试中遇到的奇葩问法 目录 一.概述 二.BIO ...
- Java的IO:BIO | NIO | AIO
原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...
- Java IO模型:BIO、NIO、AIO讲解
文章目录 IO 首先:什么是IO? 为什么要改进IO? BIO.NIO.AIO BIO NIO NIO实现原理 Channel(通道) : Buffer(缓冲区): Selector(选择器) : A ...
- Java NIO 编程:Buffer、Channel、Selector原理详解
1 Java 中的 I/O模型:BIO.NIO.AIO 1.1 BIO.NIO.AIO概念介绍 I/O 模型简单的理解:就是 用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. Ja ...
- Java NIO 基本原理以及三大核心组件
I/O 模型 Java 共支持 3 种网络编程 I/O 模型:BIO.NIO.AIO. Java BIO:同步阻塞(传统阻塞型),服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启 ...
- Java NIO编程
NIO 同步非阻塞的编程方式 主要是解决BIO的大并发问题,NIO最重要的地方是当一个连接创建后,对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以完成,当这个线程中的 ...
- Netty学习(一)-- Netty 底层 Java NIO
视频地址,建议观看,老师由浅入深,循序渐进: https://www.bilibili.com/video/BV1py4y1E7oA 前面的学习:https://blog.csdn.net/weixi ...
- 第3章-Java NIO编程
目录 1.Java NIO基本介绍 2.NIO和BIO的比较 3.NIO三大核心原理示意图 Selector.Channel和Buffer的关系图 关系图的说明 4.缓冲区(Buffer) 基本介绍 ...
最新文章
- 关于C#中的DLLImport (引)
- 顶尖CSS Web设计师Andy Clarke访谈
- UGUI全面实践教程
- Maven的pom.xml文件详解------The Basics
- 访问修饰符(C# 编程指南)
- php if终止,php判断用户是否掉线及关闭网页的方法分享
- 华为考虑对外出售5G芯片 但对象只包括苹果公司
- ElasticSearch通过Scroll方式遍历索引(Python代码)
- golang——channel笔记
- 属性篇(2)—If you love css …
- db2 linux 64位下载,Redhat6.2 64位 安装DB2V10.5
- 2020年大数据营销案例_大数据营销案例分析
- 武大计算机导师蔡贤涛,CAD模型在线集成与离线集成关键技术研究
- 石墨笔记,Onenote,Effie哪个更适合记者?
- React Native 启动流程 源码剖析
- TP5框架的多图片上传返回不显示问题
- c语言lnk1120,c - 致命错误LNK1120:C中1个未解决的外部问题 - 堆栈内存溢出
- 医疗器械公司常用技术职位—职责及要求
- ipref网络性能评估工具
- USB转JTAG小板 (一)
热门文章
- 【光学】基于matlab模拟双孔干涉附matlab代码
- html实体编码 在线,HTML实体解码
- matlab 局部变量和全局变量,C++局部变量和全局变量(详解版)
- 3DMAX砖墙神器WallBuilder:快速生成常见砖墙插件教程
- STM32+ MAX30102通过指尖测量心率+血氧饱和度
- 解答Java初级程序员该如何解决这些问题
- 娶一位俄罗斯姑娘当老婆是一种什么样的感觉?
- 6. LED 点阵屏
- lssvm回归 matlab,用lssvm做回归预测,预测的结果偏差很大,如何进行参数寻优
- 调用lssvm训练好的模型