java nio和io_无怨_无悔的博客-程序员宅基地

技术标签: java  Java nio和 io  

基本概念:

Java NIO提供了与标准IO不同的IO工作方式: 

  • Channels and Buffers(通道和缓冲区):标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。
  • Asynchronous IO(异步IO):Java NIO可以让你异步的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。
  • Selectors(选择器):Java NIO引入了选择器的概念,选择器用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个的线程可以监听多个数据通道。

使用方式:

NIO

  • 优势在于一个线程管理多个通道;但是数据的处理将会变得复杂;
  • 如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,采用这种;

传统的IO

  • 适用于一个线程管理一个通道的情况;因为其中的流数据的读取是阻塞的;
  • 如果需要管理同时打开不太多的连接,这些连接会发送大量的数据;

NIO 和IO 区别

NIO和IO的主要区别

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

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

 

 

 

 


NIO 和 IO之间的理念上面的区别(NIO将阻塞交给了后台线程执行)
  • IO是面向流的,NIO是面向缓冲区的
    • Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;
    • NIO则能前后移动流中的数据,因为是面向缓冲区的
  • IO流是阻塞的,NIO流是不阻塞的
    • Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了
    • Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。 
    • 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。
  • 选择器
    • Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。 


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sdmxdzb/article/details/78331827

智能推荐

JavaScript jQuery自增 0-10范围循环_Jm·的博客-程序员宅基地_jquery 循环10次

var n=0;$(document).ready(function() {$("#b").click(function(){n++;var v = (n < 6 ) ? n:n=0;console.log(b,n);});});<div id="b">自增循环</div>

elasticsearch-jdbc-2.3.3 安装_yhongjj的博客-程序员宅基地

github上的步骤:https://github.com/jprante/elasticsearch-jdbcwget下载安装包1. # wget http://xbib.org/repository/org/xbib/elasticsearch/importer/elasticsearch-jdbc//elasticsearch-jdbc--dist.zip解压安装包2

shiro 实现退出登录功能_坚持的信念的博客-程序员宅基地_shiro退出登录

shiro 实现退出登录功能第一种方式:1、配置权限控制,/logout.action=logout2、在页面相应的退出操作中配置链接:/logout.action 即可,并不需要实现controller层第二种方式(自定义退出登录功能)1.shiro有许多过滤器,其中就有一个LogoutFilter的过滤器,只需要继承并重写preHandle方法2.在配置文件中注入自定义实现的过...

系统架构设计师考试题库重点论文:论微服务架构_lizz666的博客-程序员宅基地

论微服务架构及其应用近年来,随着互联网行业的迅猛发展,公司或组织业务的不断扩张,需求的快速变化以及用户量的不断增加,传统的单块(Monolithic)软件架构面临着越来越多的挑战,已逐渐无法适应互联网时代对软件的要求。在这一背景下,微服务架构模式(Microservice Architecture Pattern)逐渐流行,它强调将单一业务功能开发成微服务的形式,每个微服务 运行在一个进程中;采用 HTTP 等通用协议和轻量级 API 实现微服务之间的协作与通信。 这些微服务可以使用不同...

el-form-item lable前加红色星,设置label样式_鱼仔仔03的博客-程序员宅基地_.el-form-item__label

加红色星有两种方式,加上:required="true"前面自动加红色小星星标识必填,例如:<el-form-item label="我的服务" :label-width="formLabelWidth" :required="true">但是如果我们设置的字段无法通过这种方式加红色星的话,我们可以采用另外一种办法:在label下加label设置项,例如:<el-form-item label="*服务选择:" prop="mapservice" > <labe..

随便推点

关于response对象的转发和重定向_宇太阳肩并肩的博客-程序员宅基地

Response对象的转发和重定向如何理解转发( forward) 和重定向( redirect )的·区别方式就在于他们的转发形式。forward的转发方式是直接转发的,而rediect则为间接转发。直接转发方式定义:客户端和浏览器只发出一次请求, Servlet、 HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。间接转发方式定义:实际是两次请求,服务器端在响应第一次请求的时候 ,让浏览器再向另外一个URL发出请求,从而

Labelme安装_小柒、、的博客-程序员宅基地_labelme

1.安装Labelme创建一个新的环境并切换过去conda create -n labelme python=3.6activate labelme安装pyqt5和labelmepip install pyqt5 -i https://pypi.mirrors.ustc.edu.cn/simple/pip install labelme -i https://pypi.mirrors.ustc.edu.cn/simple/安装pillowconda install pillow=5.3.

CocosCreator3D插件教程(21):插件开发心得_xu_yanfeng的博客-程序员宅基地_cocos creator插件开发

至此,本系列教程就暂时告一段落了,连更21天,每天输出一篇干货,也算是挑战了一下自己。本篇更多的是分享给大家一些个人开发插件过程中的经验感悟,希望能给你带来一些启发。尽量保证插件代码质量在发布你的插件,请尽量保证你的插件代码的质量,口碑对你的个人影响力真的很重要。最起码的,咱自己得测试测试,保证安装后不会出现致命的问题,不然,你的插件评论里面会出现各种奇奇怪怪的评论,有些评论会让你不知如何回复,那种感觉真的很绝望。尽量给插件配套相应文档即使你的插件再简单,请相信我,一定仍旧会有人遇到使用上的问题

在markdown中通过html语法实现表格中的有序列表和无需列表_汀桦坞的博客-程序员宅基地

1、先构建表格框架在如下网站将表格框架进转化为标记对形式:http://pressbin.com/tools/excel_to_html_table/index.html示例如下所示,可以看出表表示单元格的是td标记对:<table> <tr> <td>John</td> <td>Smith</td&g...

react 学习笔记(一)_yifangshikong的博客-程序员宅基地

参考学习文档: 《React学习之道》准备:1. 安装nodejs 建议版本14以上nodejs中文网2. 安装cnpm 选择安装步骤: 1. 安装 react 和 react-domnpm install react react-dom -g 2. 安装create-react-app (此模块需要nodejs 14及以上)npm install -g create-react-app 验证安装是否成功...

JAVA多线程基础入门_wpn_931的博客-程序员宅基地

        本篇博客主要通过以下几个方面向大家阐述JAVA中的多线程内容,可能篇幅比较长,希望大家能有耐心的读下去。       在实际应用中, 多线程非常有用。例如, 一个浏览器可以同时下载几幅图片。一个 Web服务器需要同时处理几个并发的请求。程序 、进程、线程分别是什么,及其他们的包含关系Java实现多线程三种方式线程的状态和方法线程基本信息和优先级线程的同步和死...