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()  不要简写或改顺序

  1. if(selector == null)
  2. selector = Selector.open();
  3. SocketChannel channel = SocketChannel.open();
  4. channel.configureBlocking(false);
  5. channel.connect(new InetSocketAddress("localhost", 1234));
  6. channel.register(selector, SelectionKey.OP_CONNECT);
  1. //连接事件
  2. if(key.isConnectable()) {
  3. SocketChannel socketChannel = (SocketChannel) key.channel();
  4. if(socketChannel.isConnectionPending())
  5. socketChannel.finishConnect();
  6. socketChannel.write(ByteBuffer.wrap(serverFileName.getBytes()));//向服务器发信息,信息中即服务器上的文件名
  7. socketChannel.register(selector, SelectionKey.OP_READ);
  8. }

nio笔记的更多相关文章

  1. Java nio 笔记:系统IO、缓冲区、流IO、socket通道

    一.Java IO 和 系统 IO 不匹配 在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚.操作系统并非不能快速传送数据,让 Java 有事可做:相反,是 JVM 自身在 I/O 方面 ...

  2. Java Nio 笔记

    网上的很多关于NIO的资料是不正确的,nio 支持阻塞和非阻塞模式 关于读写状态切换 在读写状态切换的情况下是不能使用regedit 方法注册,而应该使用以下方式进行 selectionKey.int ...

  3. NIO笔记---上

    小弟前端时间由于开发个管理系统导致断更了近20天!!马上就要春招了,学习了一下NIO,将笔记记录下,希望和我一样的18届毕业生都能找到满意的公司!! 本文记录了NIO与IO的区别,缓冲区的数据存取,直 ...

  4. Java NIo 笔记001

    1. Channel Channel接口只提供了两个方法: package java.nio.channels; public interface Channel { public boolean i ...

  5. 【Java nio】java nio笔记

    缓冲区操作:缓冲区,以及缓冲区如何工作,是所有I/O的基础.所谓“输入/输出”讲的无非就是把数据移出货移进缓冲区.进程执行I/O操作,归纳起来也就是向操作系统发出请求,让它要么把缓冲区里的数据排干,要 ...

  6. Java NIO笔记(一):NIO介绍

    Java NIO即Java Non-blocking IO(Java非堵塞I/O),由于是在Jdk1.4之后添加的一套新的操作I/O工具包,所以通常会被叫做Java New IO.NIO是为提供I/O ...

  7. Java NIO 完全学习笔记(转)

    本篇博客依照 Java NIO Tutorial翻译,算是学习 Java NIO 的一个读书笔记.建议大家可以去阅读原文,相信你肯定会受益良多. 1. Java NIO Tutorial Java N ...

  8. Java NIO 核心组件学习笔记

    背景知识 同步.异步.阻塞.非阻塞 首先,这几个概念非常容易搞混淆,但NIO中又有涉及,所以总结一下[1]. 同步:API调用返回时调用者就知道操作的结果如何了(实际读取/写入了多少字节). 异步:相 ...

  9. NIO学习笔记

    零.前言 这里整理摘录了我了解NIO的一些笔记. 参考资料: 1.深入浅出NIO之Channel.Buffer 2.深入浅出NIO之Selector实现原理 3.Java NIO vs. IO 一.N ...

随机推荐

  1. [JLOI2011]飞行路线 最短路

    题面 题面 题解 这题不是很难,因为删代价的次数不多,因此我们只需要将最短路中的状态加一维表示已经删了几次,再转移即可 #include<bits/stdc++.h> using name ...

  2. CF878C Tournament set 图论

    题面 题面 题解 如果2个人可以互相战胜,那么我们连一条无向边,于是最后会剩下t个联通块,其中每对联通块之间都有严格的大小关系(a.max < b.min),因此我们每插入一个点就相当于合并一段 ...

  3. 【MediaElement】WPF视频播放器【1】

    一.前言       前两天上峰要求做一个软件使用向导,使用WPF制作.这不,这两天从一张白纸开始学起,做一个播放演示视频的使用向导.以下是粗设计的原型代码: 二.效果图 三.代码 前台代码: < ...

  4. BZOJ1367 [Baltic2004]sequence 【左偏树】

    题目链接 BZOJ1367 题解 又是一道神题,, 我们考虑一些简单的情况: 我们先假设\(b_i\)单调不降,而不是递增 对于递增序列\(\{a_i\}\),显然答案\(\{b_i\}\)满足\(b ...

  5. 洛谷 3201 [HNOI2009]梦幻布丁 解题报告

    3201 [HNOI2009]梦幻布丁 题目描述 \(N\)个布丁摆成一行,进行\(M\)次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为\(1,2,2 ...

  6. bzoj4010: [HNOI2015]菜肴制作(拓扑排序+贪心+堆)

    这题不是求最小字典序...撕烤了半个小时才发现不对劲T T 这题是能让小的尽量前就尽量前,无论字典序...比如1能在2前面就一定要在2前面... 显然是要先拓扑排序,让小的尽量前转化成让大的尽量往后丢 ...

  7. python的复制,深拷贝和浅拷贝的区别(转)

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

  8. 04-树4. Root of AVL Tree-平衡查找树AVL树的实现

    对于一棵普通的二叉查找树而言,在进行多次的插入或删除后,容易让树失去平衡,导致树的深度不是O(logN),而接近O(N),这样将大大减少对树的查找效率.一种解决办法就是要有一个称为平衡的附加的结构条件 ...

  9. 2018南京ICPCMediocre String Problem 马拉车

    hash+二分求出最长公共前缀 然后马拉车+前缀和计数 #include <cstdio> #include <cstring> #include <queue> ...

  10. libevent学习文档(二)eventbase相关接口和参数

    Setting up a default event_base The event_base_new() function allocates and returns a new event base ...