java的nio之:java的nio系列教程之java的io和nio的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海:
我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异、它们的使用场景,以及它们如何影响您的代码设计。
Java NIO和IO的主要区别
下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分的差异。
IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
无 选择器
面向流与面向缓冲
Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读 取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该 缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。
阻塞与非阻塞IO
Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻 塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。
选择器(Selectors)
Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
NIO和IO如何影响应用程序的设计
无论您选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:
- 对NIO或IO类的API调用。
- 数据处理。
- 用来处理数据的线程数。
API调用
当然,使用NIO的API调用时看起来与使用IO时有所不同,但这并不意外,因为并不是仅从一个InputStream逐字节读取,而是数据必须先读入缓冲区再处理。
数据处理
使用纯粹的NIO设计相较IO设计,数据处理也受到影响。
在IO设计中,我们从InputStream或 Reader逐字节读取数据。假设你正在处理一基于行的文本数据流,例如:
Name: Anna
Age: 25
Email: anna@mailserver.com
Phone: 1234567890
该文本行的流可以这样处理:
InputStream input = … ; // get the InputStream from the client socket
1 |
BufferedReader reader = new BufferedReader( new InputStreamReader(input)); |
2 |
3 |
String nameLine = reader.readLine(); |
4 |
String ageLine = reader.readLine(); |
5 |
String emailLine = reader.readLine(); |
6 |
String phoneLine = reader.readLine(); |
请注意处理状态由程序执行多久决定。换句话说,一旦reader.readLine()方法返回,你就知道肯定文本行就已读完,
readline()阻塞直到整行读完,这就是原因。你也知道此行包含名称;同样,第二个readline()调用返回的时候,你知道这行包含年龄等。
正如你可以看到,该处理程序仅在有新数据读入时运行,并知道每步的数据是什么。一旦正在运行的线程已处理过读入的某些数据,该线程不会再回退数据(大多如
此)。下图也说明了这条原则:
aaarticlea/png;base64,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" alt="" />
(Java IO: 从一个阻塞的流中读数据)
而一个NIO的实现会有所不同,下面是一个简单的例子:
1 |
ByteBuffer buffer = ByteBuffer.allocate( 48 ); |
2 |
3 |
int bytesRead = inChannel.read(buffer); |
注意第二行,从通道读取字节到ByteBuffer。当这个方法调用返回时,你不知道你所需的所有数据是否在缓冲区内。你所知道的是,该缓冲区包含一些字节,这使得处理有点困难。
假设第一次 read(buffer)调用后,读入缓冲区的数据只有半行,例如,“Name:An”,你能处理数据吗?显然不能,需要等待,直到整行数据读入缓存,在此之前,对数据的任何处理毫无意义。
所以,你怎么知道是否该缓冲区包含足够的数据可以处理呢?好了,你不知道。发现的方法只能查看缓冲区中的数据。其结果是,在你知道所有数据都在缓冲区里之前,你必须检查几次缓冲区的数据。这不仅效率低下,而且可以使程序设计方案杂乱不堪。例如:
1 |
ByteBuffer buffer = ByteBuffer.allocate( 48 ); |
2 |
3 |
int bytesRead = inChannel.read(buffer); |
4 |
5 |
while (! bufferFull(bytesRead) ) { |
6 |
7 |
bytesRead = inChannel.read(buffer); |
8 |
9 |
} |
bufferFull()方法必须跟踪有多少数据读入缓冲区,并返回真或假,这取决于缓冲区是否已满。换句话说,如果缓冲区准备好被处理,那么表示缓冲区满了。
bufferFull()方法扫描缓冲区,但必须保持在bufferFull()方法被调用之前状态相同。如果没有,下一个读入缓冲区的数据可能无法读到正确的位置。这是不可能的,但却是需要注意的又一问题。
如果缓冲区已满,它可以被处理。如果它不满,并且在你的实际案例中有意义,你或许能处理其中的部分数据。但是许多情况下并非如此。下图展示了“缓冲区数据循环就绪”:
aaarticlea/png;base64,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" alt="" />
Java NIO:从一个通道里读数据,直到所有的数据都读到缓冲区里.
3) 用来处理数据的线程数
NIO可让您只使用一个(或几个)单线程管理多个通道(网络连接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。
如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维
持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。一个线程多个连接的设计方案如下图所示:
aaarticlea/png;base64,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" alt="" />
Java NIO: 单线程管理多个连接
如果你有少量的连接使用非常高的带宽,一次发送大量的数据,也许典型的IO服务器实现可能非常契合。下图说明了一个典型的IO服务器设计:
aaarticlea/png;base64,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" alt="" />
Java IO: 一个典型的IO服务器设计- 一个连接通过一个线程处理.
java的nio之:java的nio系列教程之java的io和nio的区别的更多相关文章
- Spring 系列教程之 bean 的加载
Spring 系列教程之 bean 的加载 经过前面的分析,我们终于结束了对 XML 配置文件的解析,接下来将会面临更大的挑战,就是对 bean 加载的探索.bean 加载的功能实现远比 bean 的 ...
- SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
在网上查询 Bean 的加载顺序时,看到了大量的文章中使用@Order注解的方式来控制 bean 的加载顺序,不知道写这些的博文的同学自己有没有实际的验证过,本文希望通过指出这些错误的使用姿势,让观文 ...
- SpringBoot系列教程之Bean之指定初始化顺序的若干姿势
上一篇博文介绍了@Order注解的常见错误理解,它并不能指定 bean 的加载顺序,那么问题来了,如果我需要指定 bean 的加载顺序,那应该怎么办呢? 本文将介绍几种可行的方式来控制 bean 之间 ...
- kali linux 系列教程之metasploit 连接postgresql可能遇见的问题
kali linux 系列教程之metasploit 连接postgresql可能遇见的问题 文/玄魂 目录 kali linux 下metasploit 连接postgresql可能遇见的问题. ...
- kali Linux系列教程之BeFF安装与集成Metasploit
kali Linux系列教程之BeFF安装与集成Metasploit 文/玄魂 kali Linux系列教程之BeFF安装与集成Metasploit 1.1 apt-get安装方式 1.2 启动 1. ...
- Kali Linux系列教程之OpenVas安装
Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1. 服务器层组件 2.客户层组件 安装过程 Initial setup ...
- RabbitMQ系列教程之二:工作队列(Work Queues)(转载)
RabbitMQ系列教程之二:工作队列(Work Queues) 今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题. (使用.NET 客户端 进行事例演示) ...
- WCF系列教程之WCF服务协定
本文参考自:http://www.cnblogs.com/wangweimutou/p/4422883.html,纯属读书笔记,加深记忆 一.服务协定简介: 1.WCF所有的服务协定层里面的服务接口, ...
- WCF系列教程之WCF服务宿主与WCF服务部署
本文参考自http://www.cnblogs.com/wangweimutou/p/4377062.html,纯属读书笔记,加深记忆. 一.简介 任何一个程序的运行都需要依赖一个确定的进程中,WCF ...
随机推荐
- 在T-SQL中访问远程数据库(openrowset、opendatasource、openquery)
1. 启用Ad Hoc Distributed Queries 在使用openrowset/opendatasource前要先启用Ad Hoc Distributed Queries服务,因为这个服 ...
- win8系统 host文件无法修改解决之道
host文件,路径为:C:\windows\system32\drivers\etc\hosts 方法/步骤: 方法1:用notepad++打开host文件,修改和保存 方法2:(1)首先用管理管权限 ...
- Mysql5.0以下 手工注入
order by 20 www. .com/product/introduction.php?id=-65 UNION SELECT user(),2 www. .com/product/introd ...
- 爬虫学习----pattern
1.match match(string[, pos[, endpos]]) | re.match(pattern, string[, flags]): 这个方法将从string的pos下标处起尝试匹 ...
- PHP内置的字符串处理函数
字符串的特点 1.其他类型的数据用在字符串类型处理函数中,会自动将其转化成字符串后,在处理 <?php echo substr("abcdefghijklmn",2,4 ...
- The name 'Scripts' does not exist in the current context error in MVC
创建完成ASP.NET MVC4应用程序以后,试着运行其中一个Create页面, 程序报出运行是错误: CS0103: The name 'Scripts' does not exist in th ...
- Nginx启动出错 error while loading shared libraries:
在centos5.7 32位上编译安照 nginx-1.1.16 出错 [root@localhost conf]# /usr/local/nginx/sbin/nginx/usr/local/ngi ...
- 【题解】【矩阵】【DP】【Leetcode】Minimum Path Sum
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which ...
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128) 解决办法
最近在用Python处理中文字符串时,报出了如下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ...
- Think Python - Chapter 16 - Classes and functions
16.1 TimeAs another example of a user-defined type, we’ll define a class called Time that records th ...