zoukankan      html  css  js  c++  java
  • 简单了解nio与io的区别与联系

    一、概念

    NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

    二、nio与io的区别

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

    IO NIO
    面向流 面向缓冲区
    阻塞IO 非阻塞IO
    选择器(selector)

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

    2、阻塞与非阻塞IO

    Java IO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线程被阻塞直到有一些数据被读取或数据完全写入,该线程在此期间不能再干任何事情了。
    Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
    IO的各种流是阻塞的,就是当一个线程调用读写方法时,该线程会被阻塞,直到读写完,在这期间该线程不能干其他事,CPU转而去处理其他线程,假如一个线程监听一个端口,一天只会有几次请求进来,但是CPU却不得不为该线程不断的做上下文切换,并且大部分切换以阻塞告终。
    NIO通讯是将整个任务切换成许多小任务,由一个线程负责处理所有io事件,并负责分发。它是利用事件驱动机制,而不是监听机制,事件到的时候再触发。NIO线程之间通过wait,notify等方式通讯。保证了每次上下文切换都有意义,减少无谓的进程切换。

    3、选择器(Selectors)
    Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制使得一个单独的线程很容易来管理多个通道。

    java nio原生的三大组件:selector、Channel、ByteBuffer。netty封装了nio,方便开发者进行网络io编程。

    三、NIO和IO如何影响应用程序的设计

    无论您选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:
    1、对NIO或IO类的API调用。2、数据处理。3、用来处理数据的线程数。

    1、API调用
    当然,使用NIO的API调用时看起来与使用IO时有所不同,但这并不意外,因为并不是仅从一个InputStream逐字节读取,而是数据必须先读入缓冲区再处理。

    没写完后面补充。。

    四、参考博文

    (1) https://www.cnblogs.com/aspirant/p/8630283.html (基本概念等)
    (2) https://www.jianshu.com/p/a6b7410a6fbe (部分方法讲解)
    (3) https://www.jianshu.com/p/948f60a8e64e (nio和io的区别及代码讲解)
    (4) https://www.jianshu.com/p/869095b8dc0b (nio教程)
    (5) https://www.jianshu.com/p/216bdc25940b (nio)
    (6) https://www.jianshu.com/p/f225ab63d58a (java网络编程io、nio)
    (7)https://www.jianshu.com/p/4c8d7b9edec9 (java io和nio的简单介绍)

  • 相关阅读:
    5-python基础—获取某个目录下的文件列表(适用于任何系统)
    Automated, Self-Service Provisioning of VMs Using HyperForm (Part 1) (使用HyperForm自动配置虚拟机(第1部分)
    CloudStack Support in Apache libcloud(Apache libcloud中对CloudStack支持)
    Deploying MicroProfile-Based Java Apps to Bluemix(将基于MicroProfile的Java应用程序部署到Bluemix)
    Adding Persistent Storage to Red Hat CDK Kit 3.0 (在Red Hat CDK Kit 3.0添加永久性存储)
    Carve Your Laptop Into VMs Using Vagrant(使用Vagran把您笔记本电脑刻录成虚拟机)
    使用Python生成一张用于登陆验证的字符图片
    Jupyter notebook的安装方法
    Ubuntu16.04使用Anaconda5搭建TensorFlow使用环境 图文详细教程
    不同时区的换算
  • 原文地址:https://www.cnblogs.com/jasonboren/p/13091106.html
Copyright © 2011-2022 走看看