系统学习NIO
概述
详细
一、前言
本例子用于系统学习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的更多相关文章
- 系统学习 Java IO ---- 目录,概览
Java IO 类的系统教程,原创.主要参考自英文教程 Java IO Tutorial 和 Java Doc. http://tutorials.jenkov.com/java-io/index.h ...
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
- MES系统学习
MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...
- 001 今天开始系统学习C#
2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- Hibernate的系统 学习
Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...
- css系统学习网站
最近系统学习一下css样式,找到一个不错的网站.http://css.doyoe.com/
- 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 ...
随机推荐
- 02-MariaDB主从安装SpringBoot整合MyBatis配置
关于MariaDB的介绍 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为My ...
- HDU 5305 Friends dfs
Friends 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5305 Description There are n people and m pa ...
- Codeforces Round #303 (Div. 2) A. Toy Cars 水题
A. Toy Cars Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/545/problem ...
- mysqldump之字符集问题解决
最近导数据的需求真多,年底了大家都要做分析吗?近期使用mysqldump导出的中文出现乱码问题. mysqldump -uroot -ppassword -S /tmp/mysql9991.sock ...
- C#如何用OpenFileDialog控件打开图片显示到PictureBox这个控件
openFileDialog1.Filter = "图片文件|*.jpg|BMP图片|*.bmp|Gif图片|*.gif"; OpenFileDialog ofd = new Op ...
- STM32F10X FLASH and SRAM size
STM32F10X FLASH Size SRAM Size Device Type --------------------------------------------------------- ...
- 利用Lucene与Nutch构建简单的全文搜索引擎
文章地址 1.简介 本次实现分为两个部分,第一个部分是利用Lucene构建一个全文的搜索引擎,另外一部分则是利用Nutch实现同样的功能.由于Lucene并不是一个可以直接运行的程序,且不具备爬虫和文 ...
- Rob Pike 的 5 个编程原则
原则 1. 你没有办法预测每个程序的运行时间,瓶颈会出现在出乎意料的地方,所以在分析瓶颈原因之前,先不要盲目猜测. 原则 2. 测试(measure).在测试之前不要优化程序,即使在测试之后也要慎重, ...
- VS 2017 取消结构参考线的显示
Visual studio 中的结构参考线如下所示 其可以通过如下方式取消:
- 关于hessian接口类方法顺序及对象序列化的实战研究
前段时间,提供出去的hessian接口被调用时,调用方出现序列化异常以及其他莫名的异常.同事说hessian接口使用有2个注意事项: 1.对于已经存在的hessian接口,后续增加的方法只能加在文件末 ...