NIO
nio优势
channel分类
filechannel
socketchannel
serversockerchannel
datagramchannel
是双向的 既可以读又可以写
通道之间传递
同一种通道 transform
不同通道transto 不同通道之间进行传递
selector
如果你的应用打开了多个连接,每个连接的流量很低。使用selector会很方便
thread
selector
channel
channel
channel
channel
单线程考虑
selector.open
channel注册到selector中
SelectionKey key = channel.register(selector,
Selectionkey.OP_READ);
selectKey
interest
channel
ready
选择通道
wakeup
close
buffer
基本数据类型buffer
mapbuffer 处理映射文件
读写数据
写入数据到buffer
调用flip方法
模式切换 从写模式到读模式
从buffer中读取数据
buufer。clear compact
三个属性
capacity 容器
position
limit 写多少 可以读出的数量
put
channel 到 buffer
buffer - out - buffer
get
mark reset
eauqls 和 compareTo
Scatter gather
和传统io的区别
1.具有channel和buffer 数据不经过字节字符 是通道和缓冲区之间进行数据交换
nio面向缓存
io面向流
2.可以异步asynchronous
blocking
non blocking
3.selector可以监听通道时间
可以来进行分配线程
疲软
实例使用纯粹的io
InputStream input = … ; // get the InputStream from the client socket
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String nameLine = reader.readLine();
String ageLine = reader.readLine();
String emailLine = reader.readLine();
String phoneLine = reader.readLine();
可以清楚知道那些方法执行完毕
如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:
使用纯粹的nio
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
while(! bufferFull(bytesRead) ) {
bytesRead = inChannel.read(buffer);
}
不知道是否在预期时间预期方法执行完毕
NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势
nio优势
channel分类
filechannel
socketchannel
serversockerchannel
datagramchannel
是双向的 既可以读又可以写
通道之间传递
同一种通道 transform
不同通道transto 不同通道之间进行传递
selector
如果你的应用打开了多个连接,每个连接的流量很低。使用selector会很方便
thread
selector
channel
channel
channel
channel
单线程考虑
selector.open
channel注册到selector中
SelectionKey key = channel.register(selector,
Selectionkey.OP_READ);
selectKey
interest
channel
ready
选择通道
wakeup
close
buffer
基本数据类型buffer
mapbuffer 处理映射文件
读写数据
写入数据到buffer
调用flip方法
模式切换 从写模式到读模式
从buffer中读取数据
buufer。clear compact
三个属性
capacity 容器
position
limit 写多少 可以读出的数量
put
channel 到 buffer
buffer - out - buffer
get
mark reset
eauqls 和 compareTo
Scatter gather
和传统io的区别
1.具有channel和buffer 数据不经过字节字符 是通道和缓冲区之间进行数据交换
nio面向缓存
io面向流
2.可以异步asynchronous
blocking
non blocking
3.selector可以监听通道时间
可以来进行分配线程
疲软
实例使用纯粹的io
InputStream input = … ; // get the InputStream from the client socket
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String nameLine = reader.readLine();
String ageLine = reader.readLine();
String emailLine = reader.readLine();
String phoneLine = reader.readLine();
可以清楚知道那些方法执行完毕
如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:
使用纯粹的nio
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
while(! bufferFull(bytesRead) ) {
bytesRead = inChannel.read(buffer);
}
不知道是否在预期时间预期方法执行完毕
NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势