概述
IO |
NIO |
面向流 |
面向缓冲 |
阻塞IO |
非阻塞IO |
无 |
选择器 |
- 面向流
- 面向缓冲
- 阻塞IO
- 非阻塞IO
- channel的read和write期间,线程可以管理别的channel,做其他事情
- 选择器(Selectors)
- 允许一个线程监视多个通道,注册多个通道于一个选择器,线程“选择”通道
- 选择器选择就绪通道进行操作
应用程序设计时所表现的差异
- API不同
- 数据处理
- IO
- 从InputStream或Reader逐字节(符)读取数据
- 处理状态由程序执行时间决定:一旦reader.readLine()返回,就知道文本行肯定已读完
- 可以明确知道每步拿到的数据是什么
// 行文本
Name: Anna
Age: 25
Email: anna@mailserver.com
Phone: 1234567890
// 处理方式
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String nameLine = reader.readLine();
String ageLine = reader.readLine();
String emailLine = reader.readLine();
String phoneLine = reader.readLine();
- NIO
- 从通道读取字节到ByteBuffer
- 方法返回时:并不知道所需数据是否全部已在缓冲区;所知道的是:缓冲区包含一些字节
- 对缓冲区中数据是否已完整可用的判断比较困难
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
while(!bufferFull(bytesRead)) {
bytesRead = inChannel.read(buffer);
}
- 线程数量
- IO
- NIO
- 一个线程管理多个channel
- 大量短连接:NIO更适合;少量高带宽连接:IO更适合
网友评论