zoukankan      html  css  js  c++  java
  • java 核心技术之基础篇(三)

    一、java 中提供了那些IO方式?NIO如何实现多路复用?

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

     首先,传统的java.io 包,基于流模型实现,提供了我们最熟悉的一些IO功能,比如File抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或写入流时,在读、写动作完成前,线程会一直阻塞在那里,他们之间的调用是可靠地线性顺序。

       java.io 包得好处是代码比较简单、直观、缺点是IO效率和扩展性存在局限性,容易成为使用时应用性能的瓶颈。

       很多时候,人们把java.net 下面提供的部分网络API,比如Socke、ServerSocket、HttpURLConnection 也归类到同步阻塞IO类库,因为网络通信同样是IO行为。

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

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

    知识扩展:

    首先澄清一些基本概念:

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

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

    这里还需要理解:

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

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

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

    万不要忘了flush.

     

    .---------------------------------------------未完待续的分割线-----------------------------------------------------------

  • 相关阅读:
    git把dev部分提交过的内容合并到master
    shell命令修改文件内容
    js时间格式化
    js判断对象是否为空
    JS数组遍历方法
    批量修改文件后缀
    curl实现put请求
    lumen伪静态路由设置示例
    nginx client_body_buffer_size
    nginx模块开发
  • 原文地址:https://www.cnblogs.com/liu321kai/p/9271417.html
Copyright © 2011-2022 走看看