• 系统学习NIO


    概述

    适用于有一定编程基础的朋友,想系统学习NIO这块知识的朋友。知识点大体分3块:1:>概念了解(各类IO) 2>NIO的核心(缓存区,通道等) 3>网络IO

    详细

    一、前言

    本例子用于系统学习nio, 在介绍nio知识点过程中中, 使用以下案例

    1:传统IO与NIO 代码对比与分析

    image.png

    2:NIO操作原理(例子:火车、车轨与车厢的举例)

    image.png

    3:使用NIO实现文件拷贝

    image.pngimage.png

    4:使用NIO实现非阻塞是socket通讯

    image.png

    二、代码结构图

    1、代码导入

    下载代码导入sts编辑器,如果没有sts也可以直接导入到eclipse或者idea

    2、代码结构图

    image.png

    三、项目运行

    代码使用的junit4单元测试, 只需要代码每一个测试类, 选中要执行的方法右键运行:run as JunitTest即可。

    安装学习步骤:

    1>打开BufferTest类, 先执行test1方法

    目的:学习nio的核心之一Buffer模块的常见api

    image.png

    运行效果:

    image.png

    2>打开ChannelTest类, 按照顺序, 先后运行test1, test2, test3, test4, test5方法

    目的:学习nio核心之一Channel 的获取方式, 操作方式, 案例是文件拷贝

    1:先准备一个a.avi文件

    image.png

    2:右键运行

    image.png

    3:运行结果, 多了b.avi文件, 拷贝成功

    image.png

    3>SelectorTest 跟 PipeTest 同理, 具体实现功能在注释已经解释。

    四、项目相关资料

    图片:

    image.png

    思维导图:

    11.png

    五、核心知识点解释

    传统IO: 就是jdk纯原生的IO操作

    NIO: jdk1.4 之后提供的新的io操作, 可以异步读取数据, 可以双向读取流

    缓存区:nio 核心之一, nio操作的数据暂存在缓存区中,具体操作参考:BufferTest 类

    通道:nio核心之一, nio通过缓存区操作数据, 而数据的读与写的流转需要借助通道实现。 具体操作参考:ChannelTest

    选择器:nio核心之一, nio为解决非阻塞读写问题,而提出通过事件响应方式实现io操作, 选择器是其中核心组件。具体操作参考:SelectorTest类

    网络IO:就是socket操作, 具体操作参考:SelectorTest类

    六、部分源码

    /**
     *  一:缓冲区:负责数据的存取,缓冲区本质是一个数组,用于存储不同类型的数据
     *  根据数据类型不同(boolean除外),通过了7个缓冲区:
     *  ByteBuffer
     *  CharBuffer
     *  ShortBuffer
     *  IntBuffer
     *  LongBuffer
     *  FloatBuffer
     *  DoubleBuffer
     *
     *  二:缓冲区存储数据2种核心方法
     *  put(): 存入数据到缓冲区中
     *  get(): 获取缓冲区中的数据
     *  
     *  
     *  
     *  三:缓冲区中四大核心属性
     *  capacity:容量,表示缓冲区中最大的存储数据的容量,一旦声明不能改变
     *  limit:界限,表示缓冲区中可以操作数据的大小.(limit后面数据无法进行读写)
     *  position:位置,表示缓冲区中正在操作数据的位置
     *  mark:标记,表示标记当前position的位置,可以通过reset() 回复到mark的位置
     *  
     *  约束:
     *  position <= limit <= capacity
     *
     *
     */
    public class BufferTest {
    	
    	@Test
    	public void test2() throws Exception {
    		//1:分配空间
    		ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    		//2:判断是否是直接缓冲区
    		buffer.isDirect();
    	}
    	@Test
    	public void test1() throws Exception {
    		String str = "dafei";
    		//1:分配一个指定大小的缓冲区
    		ByteBuffer buf = ByteBuffer.allocateDirect(1024);
    
    		System.out.println("-----------allocate----------------");
    		System.out.println(buf.capacity());
    		System.out.println(buf.limit());
    		System.out.println(buf.position());
    		//2:往缓冲区中存储数据
    		buf.put(str.getBytes());
    		System.out.println("----------put----------------");
    		System.out.println(buf.capacity());
    		System.out.println(buf.limit());
    		System.out.println(buf.position());
    		
    		//3:切换读模式
    		buf.flip();
    		System.out.println("----------flip----------------");
    		System.out.println(buf.capacity());
    		System.out.println(buf.limit());
    		System.out.println(buf.position());
    		
    		//4:获取缓冲区存放的数据
    		System.out.println(buf.get());
    		System.out.println(buf.get());
    		System.out.println("----------get----------------");
    		System.out.println(buf.capacity());
    		System.out.println(buf.limit());
    		System.out.println(buf.position());
    		
    		System.out.println("----------get----------------");
    		buf.rewind();
    		buf.remaining();
    		System.out.println(buf.capacity());
    		System.out.println(buf.limit());
    		System.out.println(buf.position());
    		
    	}
    }

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    NOIP2020 游记
    李超线段树
    选举「elections」
    Alt+数字输入
    素数
    CSP-S2020 爆炸记
    [CF487C] Prefix Product Sequence
    [CF489E] Hiking
    L2-019 悄悄关注 (25 分)
    L2-032 彩虹瓶 (25 分)
  • 原文地址:https://www.cnblogs.com/demodashi/p/9453012.html
Copyright © 2020-2023  润新知