nio笔记
http://blog.csdn.net/z69183787/article/category/2191483此人的博客
首先你要知道阻塞和非阻塞的概念,阻塞体现在这个线程不能干别的了,只能在这里等着。非阻塞体现在这个线程可以去干别的,不需要一直在这等着。
说NIO的非阻塞原理之前,我们需要先说一下传统的io。传统的IO是按字节传输的,即每次传输一个字节。为了提高数据传输效率,引进了带缓冲区得输入输出模式,这样每次就可以传输大量的字节数,
但是,会导致在读(写)缓冲区没有满的情况下,程序会一直等待,直到满或者关闭流才能读取(写入)。这样导致程序阻塞,降低了程序的执行效率。、
非阻塞模式 使一个线程可以同时处理多个通道, 通道accept read write 没有连接,读写数据不够或者没有时都直接返回,不用阻塞等待。
同步:线程需要的等待返回结果
异步:如果有返回结果,线程会得到通知
阻塞:方法不会立即返回结果
非阻塞:不论是否有结果 方法都会返回一个信息
1.使用通道: fileinputstream.getChannel() 打开的文件通道只有读权限,没有写权限,如果写,报异常,不要执行写操作。
注意读写权限问题。
FileInputStream input = new FileInputStream (fileName);
FileChannel channel = input.getChannel( );
// This will compile but will throw an IOException
// because the underlying file is read-only
channel.write (buffer);
2.只有流通道: sockets pipes可以非阻塞模式, 文件通道总是阻塞式的, 文件io最强大之处在于:异步io,一个进程可以请求多个io操作。
阻塞是I/O操作阻塞, 当前通道正在执行io操作,其他io操作则阻塞, 非阻塞则会返回null
3.文件锁 进程级别。
4.reigster 注册通道时,如果已经注册过,则更新,如果已经注册且 selectionkey已经被cancel, 则报异常。
key.cancel();
ssc.register(selector, SelectionKey.OP_ACCEPT);
抛异常
一个通道可以被注册到多个选择器上,但对每个选择器而言只能被注册一次。
5.每次迭代的末尾调用keyIterator.remove()
例如:首次调用select()方法,如果有一个通道变成就绪状态,返回了1,若再次调用select()方法,如果另一个通道就绪了,它会再次返回1。如果对第一个就绪的channel没有做任何操作,现在就有两个就绪的通道,但在每次select()方法调用之间,只有一个通道就绪了。
6.向selector注册通道时,通道必须是非阻塞模式
configblocking(false)
注意点:
1.it.remove();
2.想关闭channel, 用key.cancel()
key.cancel() 下次select会取消这个key相关的信息, channel也会注销
3.多线程处理时:
key.interestOps(key.interestOps() & (~SelectionKey.OP_READ));
处理完成后
key.interestOps(key.interestOps() | SelectionKey.OP_READ);
key.selector().wakeup();
4. 流末尾返回-1; while(buffer.hasremaining())写数据
while(source.read(buffer) != -1) {
buffer.flip();
while(buffer.hasRemaining()) {
dest.write(buffer);
}
buffer.clear();
}
5.
String question = new String(readBuffer.array()); array 是返回整个buffer内容
CharBuffer charBuffer = CharsetHelper.decode(readBuffer); 返回position--limit的内容
6.
/*当客户端channel关闭后,会不断收到read事件,但没有消息,即read方法返回-1
* 所以这时服务器端也需要关闭channel,避免无限无效的处理*/
try{
if((channel.read(buffer) ) > 0 ){
} else {
//关闭channel, 因为客户端已经关闭channel或者已经异常
channel.close();
}
}catch(Exception e){
if(channel != null) {
channel.close();
}
}
7.
channel.write(CharsetHelper.encode(CharBuffer.wrap(answer)));
8
.channel.open configblocking(false) connect() 不要简写或改顺序
- if(selector == null)
- selector = Selector.open();
- SocketChannel channel = SocketChannel.open();
- channel.configureBlocking(false);
- channel.connect(new InetSocketAddress("localhost", 1234));
- channel.register(selector, SelectionKey.OP_CONNECT);
- //连接事件
- if(key.isConnectable()) {
- SocketChannel socketChannel = (SocketChannel) key.channel();
- if(socketChannel.isConnectionPending())
- socketChannel.finishConnect();
- socketChannel.write(ByteBuffer.wrap(serverFileName.getBytes()));//向服务器发信息,信息中即服务器上的文件名
- socketChannel.register(selector, SelectionKey.OP_READ);
- }
nio笔记的更多相关文章
- Java nio 笔记:系统IO、缓冲区、流IO、socket通道
一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面 ...
- Java Nio 笔记
网上的很多关于NIO的资料是不正确的,nio 支持阻塞和非阻塞模式 关于读写状态切换 在读写状态切换的情况下是不能使用regedit 方法注册,而应该使用以下方式进行 selectionKey.int ...
- NIO笔记---上
小弟前端时间由于开发个管理系统导致断更了近20天!!马上就要春招了,学习了一下NIO,将笔记记录下,希望和我一样的18届毕业生都能找到满意的公司!! 本文记录了NIO与IO的区别,缓冲区的数据存取,直 ...
- Java NIo 笔记001
1. Channel Channel接口只提供了两个方法: package java.nio.channels; public interface Channel { public boolean i ...
- 【Java nio】java nio笔记
缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...
- Java NIO笔记(一):NIO介绍
Java NIO即Java Non-blocking IO(Java非堵塞I/O),由于是在Jdk1.4之后添加的一套新的操作I/O工具包,所以通常会被叫做Java New IO.NIO是为提供I/O ...
- Java NIO 完全学习笔记(转)
本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...
- Java NIO 核心组件学习笔记
背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...
- NIO学习笔记
零.前言 这里整理摘录了我了解NIO的一些笔记. 参考资料: 1.深入浅出NIO之Channel.Buffer 2.深入浅出NIO之Selector实现原理 3.Java NIO vs. IO 一.N ...
随机推荐
- 【BZOJ4004】装备购买(线性基)
[BZOJ4004]装备购买(线性基) 题面 BZOJ 洛谷 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am ...
- oracle 远程登录sqlplus TNS:无监听
1.将localhost 改成 计算机名 best-PC,或者ip地址 . 我修改成计算机名,因为经常在无线网络和有限网络之间切换 SID_LIST_LISTENER = (SID_LIST = ...
- 解题:AHOI 2013 作业
题面 emmm......我把莫队扔到了杂题里,因为感觉局限挺大的=.= 这题是莫队维护信息+分块查询答案,都是两者的基本操作,复杂度$O(m$ $sqrt(n)+n$ $sqrt(m))$ 所以为啥 ...
- 【loj2033】生成魔咒
Portal --> loj2033 Solution 这题..虽然说好像也是sam的裸题不过既然在智力康复那就强制后缀数组吧qwq (晚点再用sam写一次qwq) 首先如果是要求本质不同的 ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- 解析C#彩色图像灰度化算法的实现代码详解
http://www.jb51.net/article/37067.htm public static Bitmap MakeGrayscale(Bitmap original) { ...
- bzoj 2929 [Poi1999]洞穴攀行 网络流
2929: [Poi1999]洞穴攀行 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 499 Solved: 295[Submit][Status][ ...
- python--文件操作删除某行
使用continue跳过本次写循环就可以了 #文本内容 Yesterday when I was young 昨日当我年少轻狂 The tasting of life was sweet 生命的滋味是 ...
- python基础6--目录结构
为什么要设计好目录结构? "设计项目目录结构",就和"代码编码风格"一样,属于个人风格问题.对于这种风格上的规范,一直都存在两种态度: 一类同学认为,这种个人风 ...
- 前端PHP入门-024-字符串函数-API查看
数组.字符串和数据库是我们函数里面最.最.最常用的三类函数,数组和数据库我们现在还没有讲到,等讲到的时候我们再来和大家细说. 当然PHP的字符串函数也有很多.我们最常使用的两个系列的字符串: 单字节字 ...