zoukankan      html  css  js  c++  java
  • Java文件之NIO

    一、NIO简介

    Java NIOjava 1.4 之后新出的一套IO接口,这里的的新是相对于原有标准的Java IO和Java Networking接口。NIO提供了一种完全不同的操作方式。

    它支持面向缓冲的,基于通道的I/O操作方法。 随着JDK 7的推出,NIO系统得到了扩展,为文件系统功能和文件处理提供了增强的支持。 由于NIO文件类支持的这些新的功能,NIO被广泛应用于文件处理。

    netty就是基于NIO实现的,而netty又可以用于通信协议,如dubbo等

    二、NIO特性/NIO和IO的差别

    1 Channels and Buffers(通道和缓冲区)

    IO是面向流的,NIO是面向缓冲区的

    • 标准的IO编程接口是面向字节流和字符流的。而NIO是面向通道和缓冲区的,数据总是从通道中读到buffer缓冲区内,或者从buffer缓冲区写入到通道中;( NIO中的所有I/O操作都是通过一个通道开始的)

    • Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方;

    • Java NIO是面向缓存的I/O方法。 将数据读入缓冲器,使用通道进一步处理数据。 在NIO中,使用通道和缓冲区来处理I/O操作。

    2 Non-blocking IO(非阻塞IO)

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

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

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

    3 Selectors(选择器)

    NIO有选择器,而IO没有。

    • 选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。

    • 线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。

    三 读数据和写数据方式

    通常来说NIO中的所有IO都是从 Channel(通道) 开始的。

    从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

    从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

    数据读取和写入操作图示:

    四 NIO核心组件

    NIO包含下面几个核心的组件:

    • Channels

    • Buffers

    • Selectors

    整个NIO体系包含的类远远不止这三个,只能说这三个是NIO体系的“核心API”。

    参照:Java面试通关手册公众号

  • 相关阅读:
    总公司路由排错?
    黄永成-thinkphp讲解-个人博客讲解26集
    fedora配置网络
    只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs
    痛苦的事, 伤心的事, 一生只需要一次, 别折腾, 别忘痛- 人生, 软件, 所有人皆如是!
    我再也不-或许永远不-用zend studio-受够了!
    linux安装-版本选择-终极决定
    黄永成-thinkphp讲解-个人博客讲解25集
    linux的多媒体 播放 软件版权问题
    如何解决winows启动后出现grub?
  • 原文地址:https://www.cnblogs.com/baichendongyang/p/13235481.html
Copyright © 2011-2022 走看看