Java中的IO,BIO,NIO,AIO

       IO一直是软件开发中的核心部分之一,而随着互联网技术的提高,IO的重要性也越来越重。纵观开发界,能够巧妙运用IO,不但对于公司,而且对于开发人员都非常的重要。Java的IO机制也是一直在不断的完善,以应对日见增多的流量。

JavaIO的方式

  首先,传统java.io包提供了诸如File的抽象,输入,输出流。交互方式是同步,阻塞;

        第二,在java1.4中引入NIO框架(java.nio包),提供了Channel,Selector,Buffer等抽象,构建多路复用的,同步非阻塞IO,同时提供了更接近操作系统底层的高性能数据操作方式;

  第三,在Java 7中,NIO有了进一步的改进,也就是NIO 2。其引入了异步非阻塞IO方式,或者说AIO(Asynchronous IO)。异步IO基于事件和回调机制。

传统BIO

  传统BIO,采用BIO编程通信模型的服务端,通常由一个独立的Acceptor线程负责监听客户端的连接。它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理,处理完成后,通过输出流返回给对应的客户端,然后销毁线程。

        服务端提供IP地址和监听的端口,客户端通过TCP的三次握手与之连接,连接成功后,双方通过套接字通信。

  ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起链接操作。连接成功,双方通过输入和输出流进行同步阻塞式通信。

“你来了,我才往”的交流方式。

  ps, Java.net提供的API,如Socket,ServerSocket,HttpURLConnection也归与同步阻塞IO类库,因为网络通信同样是IO行为。

  优点:代码简单,直观,维护方便。

  缺点:IO效率极低,影响性能,却反弹性处理。

  当吞吐量增大了,有妙招:线程池。

  使用线程池管理线程,避免频繁创建,销毁线程的开销。

        但是,其底层使用的依然是同步阻塞IO,通常被称为“伪异步IO模型”,真的是治标不治本。

看官留意

  IO不仅仅时对文件的操作,网络编程中,比如Socket通信也是典型的IO操作。

  输入流(InputStream),输出流(OutputStream),用于读取或写入字节的(在java中以Stream结尾)。

  而Reader/Writer操作字符,增加了字符编解码等功能(在java中以Reader/Writer结尾)。本质上计算机操作的都是字节,不管是网络通信还是文件读取,Reader/Writer相当于构建了应用逻辑和原始数据之间的桥梁。

  BufferdOutputStream,等带缓冲区的实现,可以避免频繁的磁盘读写,进而提高IO处理效率。

区分异步和同步

  同步,一种可靠有序的运行机制,在进行同步操作时,后续的任务要等待当前调用返回;

  异步,其他任务不需要等待当前调用是否返回,依靠事件,回调机制来实现任务调用。

阻塞和非阻塞

  阻塞,当前线程处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续;

  非阻塞,不管IO操作是否结束,直接返回,相应的操作在后台继续处理。

由此总结:同步和异步是结果,阻塞和非阻塞是过程。

NIO

        New IO,或者Non-Block IO,非阻塞同步模式。

        设计原理:

                1. 服务端与客户端通过Channel通信;

                2. NIO在Channel上读写;

                3.Channel被注册到Selector多路复用器上。Selector通过一个线程轮询这些Channel,找出已经就绪的Channel。

NIO通过线程的轮询,实现非阻塞IO


NIO的组成部分:

    1.  Buffer  缓冲区;高效的数据容器

            不同的是BIO将数据直接读写到Stream对象中

            NIO的数据操作都是在缓冲区中进行的

            缓冲区实际上是一个数组,常见类型ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloutBuffer,DoubleBuffer

    2.   Channel 在NIO中被用来支持批量式IO操作的一种抽象,与流不同,通道是双向的。

            File/Socket,通常被认为是比较高层次的抽象,而Channel则是更加偏向操作系统底层的一种抽象,这也使得NIO得以充分利用现代操作系统底层机制,进行性能优化。分两大类:网络读写SelectableChannel(子类包括SocketChannel和ServerSocketChannel);文件操作(FileChannel)

    3.Selector  是NIO实现多路复用的基础。它提供一种高效机制,不断轮询注册在其上的Channel,找出处于就绪状态,通过SelectionKey取得就绪的Channel集合,进行后续的IO操作。服务端只要提供一个负责Selector轮询的线程即可,实现单线程对多Channel的高效管理,也是基于操作系统底层机制

    4.Charset  提供Unicode字符串定义,NIO也提供了相应的编解码等

Java

NIOIO之间一个最大区别:IO是面向流的,NIO是面向缓冲区的。


AIO Asynchronous IO

        NIO 2 ,在Java 7提出,NIO的升级版。实现非阻塞异步的通信模式;

        提供异步文件通道和异步套接字通道;

        其read,write方法的返回类型都是Future对象;

        而Future模型是异步的,其核心思想是:去主函数等待时间;

        基于事件和回调机制。


小结

        IO,阻塞同步通信模式,客户端与服务端三次握手,简单,吞吐量小。关键词:Socket和ServerSocket;

        NIO,非阻塞同步通信模式,客户端与服务端通过Channel连接,采用多路复用器轮询注册的Channel。关键词:SocketChannel和ServerSocketChannel;

        AIO,非阻塞异步通信模式,基于事件和回调机制,采用异步通道实现异步通信。关键词:AsynchronousSocketChannel和AsynchronousServerSocketChannel。


写在后面

主要参考资料,杨晓峰老师《Java核心技术36讲》

阿_毅《Java之IO,BIO,NIO,AIO知多少?》

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

推荐阅读更多精彩内容