• NIO的特性/NIO与IO区别


    NIO的特性/NIO与IO区别

    如果是在面试中回答这个问题,我觉得首先肯定要从 NIO 流是非阻塞 IO 而 IO 流是阻塞 IO 说起。然后,可以从 NIO 的3个核心组件/特性为 NIO 带来的一些改进来分析。如果,你把这些都回答上了我觉得你对于 NIO 就有了更为深入一点的认识,面试官问到你这个问题,你也能很轻松的回答上来了。

    1)Non-blocking IO(非阻塞IO)

    IO流是阻塞的,NIO流是不阻塞的。

    Java NIO使我们可以进行非阻塞IO操作。比如说,单线程中从通道读取数据到buffer,同时可以继续做别的事情,当数据读取到buffer中后,线程再继续处理数据。写数据也是一样的。另外,非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

    Java IO的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了

    2)Buffer(缓冲区)

    IO 面向流(Stream oriented),而 NIO 面向缓冲区(Buffer oriented)。

    Buffer是一个对象,它包含一些要写入或者要读出的数据。在NIO类库中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中·可以将数据直接写入或者将数据直接读到 Stream 对象中。虽然 Stream 中也有 Buffer 开头的扩展类,但只是流的包装类,还是从流读到缓冲区,而 NIO 却是直接读到 Buffer 中进行操作。

    在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。

    最常用的缓冲区是 ByteBuffer,一个 ByteBuffer 提供了一组功能用于操作 byte 数组。除了ByteBuffer,还有其他的一些缓冲区,事实上,每一种Java基本类型(除了Boolean类型)都对应有一种缓冲区。

    3)Channel (通道)

    NIO 通过Channel(通道) 进行读写。

    通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。

    4)Selector (选择器)

    NIO有选择器,而IO没有。

    选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。

     原文地址:https://snailclimb.gitee.io/javaguide/#/docs/java/basis/BIO,NIO,AIO%E6%80%BB%E7%BB%93?id=_22-nio%e7%9a%84%e7%89%b9%e6%80%a7nio%e4%b8%8eio%e5%8c%ba%e5%88%ab

  • 相关阅读:
    go基础系列~定义新的数据类型
    go基础类型map类型
    redis基础系列~基础监控模板
    事务的隔离级别
    ASP.NET Core 中间件的几种实现方式
    asp.net core 认证和授权实例详解
    快速理解ASP.NET Core的认证与授权
    C# Hashtable、HashSet和Dictionary的区别
    C# 中使用 Redis 简单存储
    ASP.NET Core 中间件
  • 原文地址:https://www.cnblogs.com/xiekun96/p/14220077.html
Copyright © 2020-2023  润新知