zoukankan      html  css  js  c++  java
  • NIO/AIO

    1 NIO  

         NEW IO 的简称,新的java I/O标准,jdk1.4纳入,有以下特点:

         (1)NIO基于block块,以块(硬盘数据块)为单位处理数据,比旧式的io基于流的效率高。

         (2)为各个基本类型类型提供缓存支持(buffer),最常用的是byteBuffer,用字节读写数据。

         (3)使用通道channel,作为io抽象。旧io使用的是流。

         (4)支持锁和内存映射文件的文件访问接口。内存映射文件是指可以通过channel的map方法,把文件整体映射到内存中,提高读写效率。

         (5)提供了基于selector的异步网络io

         *channel是nio的抽象,一端连接着buffer,读要从buffer读,写也要先写到buffer,另一端是要操作的文件或socket等。一般先得到文件的channel,然后声明一个buffer区域,再把buffer和channel连接起来如下。比如复制文件操作,可以从源文件和目标文件里建立两个channel,然后用一个buffer区,不断从源数据读取向目标数据写入。通道涵盖了UDP 和 TCP 网络IO,以及文件IO。

            FileInputStream fin = new FileInputStream(new File("d:\text.txt"));

           FileChannel fc=fin.getChannel();

           ByteBuffer byteBuffer=ByteBuffer.allocate(1024);

           fc.read(byteBuffer);

        * Buffer中有3个重要的参数:位置(position)、容量(capactiy)和上限(limit),还有一个可以用来读写转化的函数filp(),

            position代表当前位置,在0和capacity之间的某个位置;capacity代表总容量;如果buffer写一部分数据,没有写满,那么position处在写的数据的末尾位置,这个时候如果想读,那么调用filp(),会把position重置为0,刚才的position位置,记录为limit,那么读的时候,读到limit为止就可以了。

        *selector  允许单线程处理多个 Channel ,要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,有如新连接进来,数据接收等。selector允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。 

       *nio和 io 的区别

         1)Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有需要处理的数据。

        2)Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道。

       3)io对应的是同步阻塞,nio使用了select轮询各种请求是否就绪,在没有请求就绪的情况下也会阻塞(阻塞的是调度线程),但并没有因为数据没准备好就阻塞应用线程,所以是同步非阻塞。

    2 aio NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对AIO来说,则更加进了一步,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此AIO是不会阻塞的,此时我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。

         *在AIO socket编程中,服务端通道是AsynchronousServerSocketChannel,这个类提供了一个open()静态工厂,一个bind()方法用于绑定服务端IP地址(还有端口号),另外还提供了accept()用于接收用户连接请求。在客户端使用的通道是AsynchronousSocketChannel,这个通道处理提供open静态工厂方法外,还提供了read和write方法。有两种回调方法,第一种是发出一个事件(accept read write等)之后要指定事件处理类(回调函数),AIO中的事件处理类是CompletionHandler<V,A>,这个接口定义了两个方法,分别在异步操作成功和失败时被回调;另一种是使用Future,根据get()方法得知是否完成。

        * aio本身不会阻塞,对accept,read,write的调用都会立即返回,内核完成I/O操作以后,会将后续处理任务提交给线程池来执行,即回调;所以是异步非阻塞的。

  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/lkdirk/p/6736566.html
Copyright © 2011-2022 走看看