系统学习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类

六、部分源码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
 *  一:缓冲区:负责数据的存取,缓冲区本质是一个数组,用于存储不同类型的数据
 *  根据数据类型不同(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大师发表,拒绝转载,转载需要作者授权

 

posted on   demo例子集  阅读(1357)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示