zoukankan      html  css  js  c++  java
  • Java NIO工作机制简介

    前言

    本博客只简单介绍NIO的原理实现和基本工作流程

    I/O和NIO的本质区别

    NIO将填充和提取缓冲区的I/O操作转移到了操作系统

    I/O 以流的方式处理数据,而 NIO 以缓冲区的方式处理数据;IO是阻塞的,NIO是非阻塞的,直到有数据被读取或者数据完全写入时,IO线程才开始执行操作,而NIO在如何情况都是非阻塞的

    通道(Channel)和缓冲区(Buffer)

    NIO三个核心对象:通道(Channel)、缓冲区(Buffer)和选择器(Selector)

    缓冲区只暂时储存数据,通道用于读取和写入操作,作用相当于IO流,与IO流不同的是通道是双向的。

    NIO操作中,从通道读取的数据必须先放在缓冲区中,发送给通道的数据也先放在缓冲区中。

    NIO通道

    通道:通道是一个对象,可以通过它读取和写入数据,可以理解为是对原I/O包中的流的模拟。

    通道和流的区别在于通道是双向。通道可以用于读、写或者同时用于读写,而流只有一个方向,即一个流必须是InputStream的子类或者OutputStream的子类。

    • FileChannel:从文件中读写数据。
    • DatagramChannel:能通过UDP读写网络中的数据。
    • SocketChannel:能通过TCP读写网络中的数据。
    • ServerSocketChannel:可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个Socke Channel。

    NIO缓冲区

    缓冲区:缓冲区实质上是一个数组。最常用的缓冲区类型是ByteBuffer,对应Java的基本类型都有一种缓冲区区

    缓冲区类型:

    • ByteBuffer
    • CharBuffer
    • ShortBuffer
    • IntBuffer
    • LongBuffer
    • FloatBuffer
    • DoubleBuffer

    NIO选择器

    选择器(Selector):选择器用于监听多个通道的事件。Selector允许单线程处理多个 Channel。也就是说可以注册多个通道,使用同一个选择器,只要开一条线程就可以执行

    NIO读写操作

    NIO读取过程:先创建一个缓冲区,通道读取数据放在这个缓冲区

    graph LR
    
    Channel-->Buffer
    

    NIO写入过程:也是先创建一个缓冲区,里面有储存数据的话,将这些数据发给管道执行写入操作

    graph LR
    Buffer-->Channel
    

    文件读取操作
    读取文件过程:从FileInputStream获取Channel,创建Buffer,将数据从Channel读到Buffer中

    //从FileInputStream获取通道
    FileInputStream fis = new FileInputStream( "readandshow.txt" );
    FileChannel fc = fis.getChannel();
    //创建缓冲区
    ByteBuffer buffer = ByteBuffer.allocate( 1024 );
    //将数据从通道读到缓冲区
    fc.read( buffer );
    

    文件写入过程

    FileOutputStream fout=new FileOutputStream("write.txt");
    FileChannel fc=fout.getChannel();
    ByteBuffer buffer=ByteBuffer.allocate(1024);
    for (int i=0; i<data.length; i++) {
          buffer.put(data[i]);
    }
    buffer.flip();
    fc.write(buffer);
    

    附录:
    NIO入门
    NIO系列教程

  • 相关阅读:
    terraform入门操作指南
    linux常用命令
    pssh用法范例
    nginx共享内存使用
    Redis监控指标[转]
    xargs用法笔记
    systemd用法记录一
    esxcli部分常用命令
    lua自定义功能模块table类型转string类型
    curl用法笔记
  • 原文地址:https://www.cnblogs.com/mzq123/p/9064720.html
Copyright © 2011-2022 走看看