博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java NIO
阅读量:6955 次
发布时间:2019-06-27

本文共 2263 字,大约阅读时间需要 7 分钟。

传统的io叫BIO,Blocked Input Output。
NIO,Non-Blocked Input Output。

1.同BIO的比较

1.1 阻塞与非阻塞

BIO的各种流是阻塞的。这意味着,当一个线程调用
read() 或
write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。

1.2 单向与双向

BIO的操作通常是单向的,即一个流必须是
InputStream
OutputStream的子类,只能单向处理。
NIO的channel,可以双向读写。所以它比stream可以更好地映射底层操作系统的API。特别是在linux OS中,网络编程的底层通道都是全双工的。

2.Channel

java.nio.channels.Channel

channel是一个通道,通过它可以读取和写入数据。

FileChannel 从文件中读写数据。

DatagramChannel 能通过UDP读写网络中的数据。
SocketChannel 能通过TCP读写网络中的数据。

ServerSocketChannel可以监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel。

3.selector

java.nio.channels.Selector

多路复用器。

它会不断轮询注册在其上的channel,如果某个channel有新的事件(如建立新连接、读事件、写事件),这个channel就处于就绪状态,会被selector轮询出来。然后通过selectionKey可以获取就绪的Channel的集合,进行后续的IO操作。

只需一个线程负责selector轮询,就可以接入成千上万的客户端,这比以前是个非常大的进步。

Selector java.nio.channels.Selector.open()

打开一个selector。
SelectionKey java.nio.channels.SelectableChannel.register(Selector sel, int ops) 
向Selector注册此channel。
SelectableChannel java.nio.channels.SelectionKey.channel()
返回这个SelectionKey对应的channel。
boolean java.nio.channels.SelectionKey.isReadable()
对应的channel是否可读。

int java.nio.channels.Selector.select() 

同步函数。当注册在其上的若干个channel有IO就绪动作时,得到返回。

4.SocketChannel

跟TCP通信相关的channel。

4.1 server

java.nio.channels.ServerSocketChannel

就是ServerSocketChannel。
ServerSocketChannel java.nio.channels.ServerSocketChannel.open()
拿到ServerSocketChannel,起到作构造函数的效果。
ServerSocket java.nio.channels.ServerSocketChannel.socket()
获取ServerSocket。
void java.net.ServerSocket.bind(SocketAddress endpoint)
绑定端口。
SocketChannel java.nio.channels.ServerSocketChannel.accept() 
监听socket收到链接请求,返回一个通信socket。

4.2 client

SocketChannel java.nio.channels.SocketChannel.
open(SocketAddress remote)
客户端链接远程端口。

4.3 通信部分

int java.nio.channels.SocketChannel.write(ByteBuffer src)

将src的内容写入channel里。
int java.nio.channels.SocketChannel.read(ByteBuffer dst)
将channel的数据写入dst中。

5.ByteBuffer

java.nio.ByteBuffer

nio中很常见的一个类,用于缓冲字节。

ByteBuffer java.nio.ByteBuffer.allocate(int capacity)
拿到ByteBuffer。初始时,limit为capacity,position为0。
ByteBuffer java.nio.ByteBuffer.put(byte[] src)
将src内容放入自身。

byte[] java.nio.ByteBuffer.array()

以byte数组的形式返回自身内容。

Buffer java.nio.Buffer.flip()

常用于读写模式的反转。

5.1 图解flip

图5-1 put。写模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。

图5-2 flip。写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。

转载地址:http://nynil.baihongyu.com/

你可能感兴趣的文章
UITextField设置大全
查看>>
Eclipse安装m2eclipse插件(Maven)
查看>>
JAVA获取CLASSPATH路径
查看>>
虚拟机NAT模式无法上网问题的解决办法
查看>>
java学习笔记--线程同步
查看>>
No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$
查看>>
windows 下最快搭建svn服务器方法
查看>>
获取android系统外置存储卡路径的方法
查看>>
mysql 链接错误
查看>>
php 数组字符串搜索array_search技巧
查看>>
hive中的NULL
查看>>
进程死锁(银行家算法)
查看>>
云存储热潮来袭:大数据时代告别U盘
查看>>
FragmentTransaction add 和 replace 完全解析
查看>>
1. ASIHttpRequest-创建和执行request
查看>>
mysql中某张表修改较大时的处理
查看>>
如何退出telnet界面
查看>>
C++的重载操作符(operator)介绍
查看>>
const、static、内部链接属性和外部链接属性整理
查看>>
nginx+多个tomcat配置
查看>>