NIO(一)
1、NIO是什么?
是JDK1.4之后推出的一个新的IO操作(netty、mina通讯框架的底层都是NIO实现的连接)
2、NIO和IO的区别(阻塞只会出现在网络通讯中,都是同步)
NIO:非阻塞类型No-block-IO,通过Channel(通道)+Buffer(缓冲区)实现IO操作,NIO为双向缓冲流;数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中;
等服务器把数据加载完过后,再去读取
IO:阻塞类型block-IO,传统IO为单向(输入流和输出流只能执行一个)
如果网络传输很慢,程序就会一直等待,直到传输完为止
注:JDKS1.7之后,优化:
同步非阻塞:NIO(只有一个客户端去获取)
异步非阻塞:AIO(可以多个客户端去获取)

3、创建测试类(NIOBufferDemo)
package com.cppdy.nio;
import java.nio.ByteBuffer;
public class NIOBufferDemo {
public static void main(String[] args) {
ByteBuffer buf = ByteBuffer.allocate(1024);
System.out.println("初始化之后的信息:");
// 当前指针位置
System.out.println("position:" + buf.position());
// 当前缓冲区已有的数据大小(首先要打开缓冲区)
System.out.println("limit:" + buf.limit());
// 缓冲区最大容量
System.out.println("capacity" + buf.capacity());
// 放入5个
buf.put("cppdy".getBytes());
System.out.println("放入值之后:");
System.out.println("position:" + buf.position());
System.out.println("limit:" + buf.limit());
System.out.println("capacity" + buf.capacity());
System.out.println("开启读之后的效果:");
// 开启读
buf.flip();
System.out.println("position:" + buf.position());
System.out.println("limit:" + buf.limit());
System.out.println("capacity" + buf.capacity());
byte[] bytes = new byte[buf.limit()];
buf.get(bytes);
System.out.println("获取到的值:" + new String(bytes, 0, bytes.length));
System.out.println("获取值之后的效果:");
System.out.println("position:" + buf.position());
System.out.println("limit:" + buf.limit());
System.out.println("capacity" + buf.capacity());
System.out.println("开启重复读之后的效果:");
buf.rewind();
System.out.println("position:" + buf.position());
System.out.println("limit:" + buf.limit());
System.out.println("capacity" + buf.capacity());
System.out.println("清空缓冲区之后的效果:");
// 调用clear方法之后其实不是真正的清空缓冲区,只是把所有的信息复原而已
buf.clear();
System.out.println("position:" + buf.position());
System.out.println("limit:" + buf.limit());
System.out.println("capacity" + buf.capacity());
System.out.println("值:" + (char) buf.get());
}
}
NIO(一)的更多相关文章
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- BIO\NIO\AIO记录
IO操作可以分为3类:同步阻塞(BIO).同步非阻塞(NIO).异步(AIO). 同步阻塞(BIO):在此种方式下,用户线程发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后, ...
- 支撑Java NIO 与 NodeJS的底层技术
支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...
- Java I/O and NIO [reproduced]
Java I/O and NIO.2---Five ways to maximize Java NIO and NIO.2---Build more responsive Java applicati ...
- JAVA NIO学习笔记1 - 架构简介
最近项目中遇到不少NIO相关知识,之前对这块接触得较少,算是我的一个盲区,打算花点时间学习,简单做一点个人学习总结. 简介 NIO(New IO)是JDK1.4以后推出的全新IO API,相比传统IO ...
- Java NIO概述
Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然 Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Se ...
- JAVA NIO Socket通道
DatagramChannel和SocketChannel都实现定义读写功能,ServerSocketChannel不实现,只负责监听传入的连接,并建立新的SocketChannel,本身不传输数 ...
- JAVA NIO FileChannel 内存映射文件
文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...
- java nio系列文章
java nio系列教程 基于NIO的Client/Server程序实践 (推荐) java nio与并发编程相关电子书籍 (访问密码 48dd) 理解NIO nio学习记录 图解ByteBuff ...
- (转)NIO与AIO,同步/异步,阻塞/非阻塞
原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...
随机推荐
- Liunx/RHEL6.5 Oracle11 安装记录[缺少依赖包的解决方案]
1.将镜像文件挂,如/mnt # mount -o loop rhel-server-6.1-x86_64-dvd.iso /mnt#这一步其实有很多实现方法,如可以将镜像文件中的Packages文件 ...
- t-sql对被除数为0&除数小于被除数结果为0&除法保留2位小数的处理
SELECT round(CAST(12 AS FLOAT)/nullif(13,0),2,1) FROM TB
- react-踩坑记录——iconfont
选取图标,添加至购物车后,下载代码. 后将下载了的文件夹改名,放入css文件夹中.在组件中使用到的时候按路径引入“iconfont.css”文件即可. 使用
- 浏览器修改或添加Cookie--chrome插件【edit this cookie】、【postman】
需求背景:某天用浏览器请求某个 API 提示: {"RESULT_TYPE" : -1 , "STATE" : 401 , "RESULT_DESC& ...
- linux中如何使用终端裁剪图片?
1,首先要安装支持图片裁剪的包: sudo apt-get install imagemagick 需要的话可以update一下, 2,在图片所在位置打开终端,我的我的截图叫screenshot.pn ...
- tomat startup.bat 日志乱码问题解决
1.修改conf 下的logging.properties java.util.logging.ConsoleHandle.encoding=GBK C:\Users\Administrator> ...
- listView从底部回到顶部代码实现
可用如下方法: 1.平滑的回到顶部,但是会划过中间的每一页 mListView.getRefreshableView().smoothScrollToPosition(0); 2.直接跳到顶部 if ...
- C++拷贝构造函数(深拷贝&浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=88; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. ...
- python标准库之argparse
argparse的使用 argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并 ...
- boost.asio包装类st_asio_wrapper开发教程(2013.12.8更新)(二)
如果你是偶然浏览到这里,请先看 源代码及例程下载地址:命令行:svn checkout http://st-asio-wrapper.googlecode.com/svn/trunk/ st-asio ...