第十一章、Java的IO方式及NIO实现复用

基本概念:

 同步和异步(synchronous/asynchronous):同步是一种可靠的有序运行机制、当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步;而异步相反,其他任务不需要等待当前调用返回,通常依靠事件、回调等机制来实现任务间次序关系

阻塞与非阻塞(blocking/non-blocking):在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续。比如ServerSocket新连接建立完毕,或数据读取,写入操作完成;而非阻塞则是不管IO操作是否结束,直接返回,相应操作在后台继续处理。

IO多路复用:IO指的就是我们网络IO,多路指多个TCP连接(或多个Channel),复用指复用一个或少量线程。串起来就是很多个网络IO复用一个或少量的线程来处理这些连接。

二、IO和NIO的区别

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

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


Java IO方式由很多种,基于不同的IO抽象模型和交互方式,可以进行简单区分。

首先,传统的Java.IO包,它基于流模型实现,提供了我们最熟知的一些IO功能,比如File抽象、输入输出流等。

交互方式是同步、阻塞的方式。也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。


Java.io包的好处是代码比较简单、直观,缺点是IO效率和扩展性存在局限性,容易成为应用性能的瓶颈。很多时候,人们也把Java.net下面提供的部分API,比如Socket、ServerSocket、HttpURLConnection也归类到同步阻塞IO类库,因为网络通信同样也是IO行为。


第二,在Java 1.4中引入了NIO框架(Java.nio包),通过Channel、Selector、Buffer等新的抽象,可以构建多路复用、同步非阻塞IO程序,同时提供了更接近操作系统底层的高性能数据操作方式。


第三、在Java 7中,NIO有了进一步的改进,也就是NIO 2,引入了异步非阻塞IO方式,也有很多人叫它AIO(Asynchronous IO)。异步IO操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。


总结

IO不仅仅是对文件的操作,网络编程中,比如Socket通信,都是典型的IO操作目标:

输入流、输出流(InputStream/OutputStream)是用于读取或写入字节的,例如操作图片文件;

而Reader/Writer则是用于操作字符,增加了字符编码解码等功能,适用于类似从文件中读取或者写入文本信息。本质上计算机操作的都是字节码,不管是网络通信还是文件读取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁;

BufferedOutputStream等带缓冲区的,可以避免频繁的磁盘读写,进而提高IO处理效率,这种设计利用了缓冲区,将批量数据进行一次操作,但在使用中千万别忘了flush。


很多IO工具类都实现了Closeable接口,因为需要进行资源的释放。比如,打开了FileInputStream,他就会获取相应的文件描述符,需要利用try-with-resources、try-finally等机制保证FileInputStream被明确关闭,进而相应文件描述符也会失效,否则将导致资源无法被释放。


类型和结构关系图



JavaNIO

NIO的主要组成部分:

Buffer,高效的数据容器,处理布尔类型,所有原始数据类型都有相应的Buffer实现;

Channel,类似在Linux之类操作系统上看到的文件描述符,是NIO中被用来支持批量式IO操作的一种抽象;

File或者Socket,通常被认为是比较高层次的抽象,而Channel则是更加操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,获得特定场景的性能优化,例如,DMA(Direct Memory Access)等。不同层次的抽象是相互关联的,可以通过Socket获取Channel,反之亦然。

Selector,是NIO实现多路复用的基础,它提供了一种高效的机制,可以检测到注册在Selector上的多个Channel中,是否有Channel处于就绪状态,进而实现了单线程对多Channel的高效管理。


NIO的组成部分



NIO下的客户端与服务器交互图



参考文档:https://segmentfault.com/a/1190000012316621

https://gitbook.cn/books/5b1792ad26a49a55324e782c/index.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容