概述

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

详细

一、前言

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

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

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

3:使用NIO实现文件拷贝

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

二、代码结构图

1、代码导入

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

2、代码结构图

三、项目运行

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

安装学习步骤:

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

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

运行效果:

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

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

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

2:右键运行

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

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

四、项目相关资料

图片:

思维导图:

五、核心知识点解释

传统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大师发表,拒绝转载,转载需要作者授权

系统学习NIO的更多相关文章

  1. 系统学习 Java IO ---- 目录,概览

    Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...

  2. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  3. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  4. MES系统学习

    MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...

  5. 001 今天开始系统学习C#

    2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...

  6. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  7. Hibernate的系统 学习

    Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...

  8. css系统学习网站

    最近系统学习一下css样式,找到一个不错的网站.http://css.doyoe.com/

  9. Ubuntu LTS 系统学习使用体会和实用工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04

    Ubuntu LTS 系统学习体会和工具软件汇总 6.04 8.04 10.04 12.04 14.04 16.04 ubuntu入门必备pdf:http://download.csdn.net/de ...

随机推荐

  1. 矩阵乘法快速幂 cojs 1717. 数学序列

    矩阵乘法模板: #define N 801 #include<iostream> using namespace std; #include<cstdio> int a[N][ ...

  2. PHP生成短网地址

    思路: 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 3 ...

  3. 2015 UESTC 数据结构专题C题 秋实大哥与快餐店 字典树

    C - 秋实大哥与快餐店 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 ...

  4. 开发Google Material Design风格的WPF程序

    今天在网上看到了一个Material Design风格的WPF皮肤,看上去还是挺不错的 这个项目是开源的,感兴趣的朋友可以下载试下: https://github.com/ButchersBoy/Ma ...

  5. STM32 USB VBUS 监控

    OTG_FS general core configuration register (OTG_FS_GCCFG) Bit 21 NOVBUSSENS: VBUS sensing disable op ...

  6. LT3759 宽输入电压范围升压 / 负输出 / SEPIC 控制器 可在输入电压低至 1.6V 的情况下工作

    引言当今的许多电子设备都需要一个负输出或正输出转换器,有时则是两者均需要.另外,它们还必需采用各种电源运作,包括 USB.墙上适配器.碱性电池和锂电池等. 为了从可变输入电压产生不同极性的输出,电源设 ...

  7. redis.conf配置解释

    daemonize:如果需要在后台运行,把该项改为yespidfile:配置多个pid的地址,默认在/var/run/redis.pidbind:绑定ip,设置后只接受来自该ip的请求port:监听端 ...

  8. A电脑的gho还原到B电脑上的驱动解决方案

    近来给B笔记本做系统,我有一个gho,是A电脑的,我想直接把系统复制过去,我的这个gho有50G,里面已经配置好了java,安卓,cocos2dx的各种环境变量,安卓开发的朋友都知道这个有多恶心,我就 ...

  9. jQuery 对象和 DOM 对象

    jQuery(DOM对象) 或者 $(DOM对象) 此函数的作用是将DOM对象,转换为jQuery的对象 DOM对象其实就是javascript的函数对象,可以用来操作所有HTML元素.比如: a标签 ...

  10. Linux进程间通信—套接字

    六.套接字(socket) socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信.一个套接口可以看做是进程间通信的端点(endpoint),每个套接口 ...