Java NIO与IO的区别和对比与比较的区别

Java_NIO与IO的区别和比较_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java_NIO与IO的区别和比较
&&网络通信
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩18页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢Java NIO之NIO与传统IO的区别
Java NIO之NIO与传统IO的区别
神奇的未解之谜
I/OI/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的。单独的程序一般是让系统为它们完成大部分的工作。在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。传统流IO的好处是使用简单,将底层的机制都抽象成流,但缺点就是性能不足。而且IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。以socket.read()为例子:传统的BIO里面socket.read(),如果TCP RecvBuffer里没有数据,函数会一直阻塞,直到收到数据,返回读到的数据。NIO为什么要使用 NIO?NIO 的创建目的是为了让 Java 程序员可以实现高速 I/O 而无需编写自定义的本机代码。NIO 将最耗时的 I/O 操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。流与块的比较原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。NIO的buffer机制NIO性能的优势就来源于缓冲的机制,不管是读或者写都需要以块的形式写入到缓冲区中。NIO实际上让我们对IO的操作更接近于操作系统的实际过程。所有的系统I/O都分为两个阶段:等待就绪和操作。举例来说,读函数,分为等待系统可读和真正的读;同理,写函数分为等待网卡可以写和真正的写。以socket为例:先从应用层获取数据到内核的缓冲区,然后再从内核的缓冲区复制到进程的缓冲区。所以实际上底层的机制也是不断利用缓冲区来读写数据的。即使传统IO抽象成了从流直接读取数据,但本质上也依然是利用缓冲区来读取和写入数据。所以,为了更好的理解nio,我们就需要知道IO的底层机制,这样对我们将来理解channel和buffer就打下了基础。这里简单提一下,我们可以把bufffer就理解为内核缓冲区,所以不论读写,自然都要经过这个区域,读的话,先从设备读取数据到内核,再读到进程缓冲区,写的话,先从进程缓冲区写到内核,再从内核写回设备。NIO的非阻塞机制NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。下图是几种常见I/O模型的对比:image.png对于NIO,如果TCP RecvBuffer有数据,就把数据从网卡读到内存,并且返回给用户;反之则直接返回0,永远不会阻塞。所以我们可以NIO实现同时监听多个IO通道,然后不断的轮询寻找可以读写的设备。NIO的IO模型可以理解为是IO多路复用模型和非阻塞模型,同时还有事件驱动模型。这里需要知道一点,就是IO多路复用是一定需要实现非阻塞的。小结NIO相对于IO流的优势:非阻塞buffer机制流替代块学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,我们一起学Java!
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
神奇的未解之谜
百家号 最近更新:
简介: 分享动物世界的奇怪事,满足你的好奇心!
作者最新文章博客分类:
当学习java NIO和IO API时,大脑中会很快涌现一个问题:
什么时候用IO?什么时候用NIO?
这篇文章作者将尝试阐明Java NIO和IO之间的一些区别、它们的用例、它们各自是如何影响我们的代码设计的。
Java NIO和IO的主要区别
以下表格简要说明了NIO和IO的区别,接着我们将详细说明表格中的每个不同点。
流式(Stream oriented)
缓冲式(Buffer oriented)
选择器(Selectors)
面向流和缓冲型
Java NIO和IO第一个大的不同点是IO是面向流的,NIO则是缓冲型的。那么,这到底是什么意思?
Java IO是面向流的意味着我们从一个流中一次读取一个或多个字节。而要对读到的字节作何处理由我们自己决定;这其中没有任何缓存。此外,我们不能在数据流中来回移动;如果想要在从流读取的数据中来回移动,我们需要首先将数据缓存到缓冲区。
Java NIO的缓冲型方法稍有不同。数据读取到缓冲区后被加工,我们可以根据需求在数据中来回移动。这为处理提供了灵活性;然而为了充分处理所有数据我们还需要检查缓冲区是否包含所有需要的数据,并且我们需要确保读取更多数据到缓冲区时未被处理的数据不能被覆盖。
阻塞型IO和非阻塞型IO
Java IO的各种流是阻塞型的。这意味着,当一个线程调用read()方法或write()方法时这个线程将一直被阻塞,直到有数据被读到或者数据被完全写入;在被阻塞的同时,该线程不能做任何其他事情。
Java NIO的非阻塞模式允许一个线程从一个channel中请求读取数据,这只会取到当前有效的数据或当前没有数据有效时获取不到任何数据;而不是一直阻塞直到所读取数据准备好为止;在这同时该线程可以做其他事情。
这个过程对非阻塞式数据写入也是成立的。一个线程可以写入一些数据到channel,但是不用等待数据被完全写入。该线程在请求完成后可以继续同时去做其他事情。
当线程不在IO调用上被阻塞时,那么它们的空闲时间通常都花在了在其他channel上执行IO操作。也就是说,一个线程可以管理多个输入和输出的channel。
选择器(Selectors)
Java NIO中的selector允许一个线程监视多个channel的输入。我们可以在一个selector上注册多个channel,然后使用一个线程来 “选择”输入可用的channel来处理,或者选择准备好写入的channel。这种选择器模式使单个线程管理多个channel变的非常容易。
NIO和IO对应用设计的影响
不论我们选择NIO还是IO作为我们的IO工具包都可能在以下几方面影响应用的设计:
NIO或IO API类的调用
数据的处理
用于处理数据的线程数量
当然NIO API的调用和IO是不一样的,这没什么可奇怪的。与IO从流如InputStream中一个字节一个字节读取数据不同,使用NIO时数据必须先读到一个缓冲区中,然后再从缓冲区中处理。
使用NIO设计和使用IO设计时数据的处理也会受影响。
IO设计中我们从InputStream或Reader中一个字节一个字节中读取数据。假设我们要处理一个基于流的文本数据,例如:
Name: Anna
使用流处理这个文本代码如下:
IInputStream input = ... ; // get theInputStream from the client socket
BufferedReader reader = newBufferedReader(new InputStreamReader(input));
String nameLine = reader.readLine();
String ageLine = reader.readLine();
String emailLine = reader.readLine();
String phoneLine = reader.readLine();
请 注意,处理状态是有程序执行多远决定的。换句话说,一旦第一个reader.readLine()方法返回,我们就可以知道完整的一行文本读取完 成;readLine()方法在一行读完之前一直保持阻塞状态,那就是原因;这一行包含name信息。相似的,当第二行readLine()方法返回,我 们得到的是年龄信息,等等。
如我们所见,这个程序只有在有新数据可读的时候才向前执行,每一步我们都知道读到的数据是什么;一旦执行线程在代码中向前读取过一些数据,该线程在数据中将不能后退(绝大多数时候不能)。该规则如图所示:
图1:java IO 从阻塞流中读取数据
NIO的实现则有所不同,以下是代码例子:
ByteBuffer buffer =ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
请注意第二行从channel中往ByteBuffer中读取字节的代码。当该方法调用返回时我们并不知道是否我们需要的全部数据都已经在缓冲区之内了。我们所知道的就是缓冲区中包含一些字节。这使得处理在一定程度上边的更难。
假设,如果在第一个read(buffer)调用之后读到缓冲区的数据只有半行。例如,"Name: An"。我们能处理这个数据吗?不能。我们需要等待直到至少一整行数据被读到缓冲区之后,在读取完整一行之前去处理数据是毫无意义的。
那么我们如何知道缓冲区中是否包含有足够的数据来满足处理要求?不知道。唯一的解决办法就是查看缓冲区中的数据。这将导致我们需要多次检查缓冲区中的数据来确认数据是被完全读到缓冲区中。这种方式效率低,而且可能会导致程序设计混乱。例如:
ByteBuffer buffer = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buffer);
while(! bufferFull(bytesRead) ) {
bytesRead = inChannel.read(buffer);
bufferFull()方法来跟踪有多少数据已读取到缓冲区,根据缓冲区是否已满来返回true或者false。换句话说,如果缓冲区准备好可以被处理,则被认为是完整的。
虽然bufferFull()方法扫描缓冲区,但是在它被调用之前以相同的状态离开缓冲区。如果状态不相同,接下来读入缓冲区的数据可能不会读在正确的位置。这不是不可能的,但这是另一个需要注意的问题。
如果缓冲区完整,那么就可以被处理。如果不完整,在特定场景中允许的话,我们也许可以部分的处理已经在缓冲区中的数据。大多数情况下这种情况是不被允许的。
如下图展示的是“缓冲中数据是否准备好”的逻辑:
图2:Java NIO 从channel中读取数据直到所有数据都存入缓冲区
NIO允许使用单个(或少量)线程来管理多种channel(网络连接或文件),但是代价是解析数据比使用阻塞流来读取数据更复杂。
如果同时需要管理数千连接,而每个连接只是发送少量数据,比如聊天服务器,使用NIO实现则比较有优势。相似的,如果需要保持很多连接和其他机器保持连接,如p2p网络,使用单线程去管理所有连接也许比较合适;这中单线程、多连接的设计图如下:
图3:Java NIO 一个线程管理多个连接
如果非常高的带宽下有很少连接一次性发送很多数据,那么经典的IO实现方式也许是最合适的。使用经典IO设计图如下:
图4:Java IO 经典IO服务器设计-一个连接由一个线程处理
1. 本文由程序员学架构翻译
2. 本文译自 /articles/java-nio-vs-io
3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )
4. 更多文章请扫码:
浏览: 188363 次
[color=red][size=xx-small][list ...
&script&&/script& ...
冰糖葫芦 写道xiaobadi 写道并没有看到你的代码用到了x ...
xiaobadi 写道并没有看到你的代码用到了xssProte ...
并没有看到你的代码用到了xssProtect-0.1.jar、 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'在 SegmentFault,解决技术问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
一线的工程师、著名开源项目的作者们,都在这里:
获取验证码
已有账号?
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
补充:查阅网上相关资料都说,NIO是和操作系统底层相关的,这就一句话,不得其解;还有NIO的Selector的那个工作模式它是怎么实现的呢?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
内核空间、用户空间、计算机体系结构、计算机组成原理、…… 确实有点儿深奥。
我的新书《代码之谜》会有专门的章节讲解相关知识,现在写个简短的科普文:
就速度来说 CPU & 内存 & 硬盘
I- 就是从硬盘到内存
O- 就是从内存到硬盘
第一种方式:我从硬盘读取数据,然后程序一直等,数据读完后,继续操作。这种方式是最简单的,叫阻塞IO。
第二种方式:我从硬盘读取数据,然后程序继续向下执行,等数据读取完后,通知当前程序(对硬件来说叫中断,对程序来说叫回调),然后此程序可以立即处理数据,也可以执行完当前操作在读取数据。
在一起的 Java IO 中,都是阻塞式 IO,NIO 引入了非阻塞式 IO。
还有一种就是同步 IO 和异步 IO。经常说的一个术语就是“异步非阻塞”,好象异步和非阻塞是同一回事,这大概是一个误区吧。
至于 Java NIO 的 Selector,在旧的 Java IO 系统中,是基于 Stream 的,即“流”,流式 IO。
当程序从硬盘往内存读取数据的时候,操作系统使用了 2 个“小伎俩”来提高性能,那就是预读,如果我读取了第一扇区的第三磁道的内容,那么你很有可能也会使用第二磁道和第四磁道的内容,所以操作系统会把附近磁道的内容提前读取出来,放在内存中,即缓存。
(PS:以上过程简化了)
通过上面可以看到,操作系统是按块 Block从硬盘拿数据,就如同一个大脸盆,一下子就放入了一盆水。但是,当 Java 使用的时候,旧的 IO 确实基于 流 Stream的,也就是虽然操作系统给我了一脸盆水,但是我得用吸管慢慢喝。
于是,NIO 横空出世。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
以前看过一篇NIO文章还不错,
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
nio 少了一次从 内核空间 到 用户空间的 copy.
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:对比Java.nio 和 Java.io - ImportNew
| 标签: ,
本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档。这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性。Java.nio提出了新的流(stream)通讯概念并且加入了新的缓冲、文件流以及socket(套接字)特性。
java.io 概览
这个包通过数据流和序列化机制来实现系统输入和输出。并且支持多种类型的数据流,包括简单的字节、原生数据类型、地区字符以及对象。流是一个数据的序列:一个程序使用输入流从一个源头读取数据;
另一个程序使用输出流写入并发送数据到目的地。
这些程序都使用字节流来执行字节的输入和输出。所有涉及字节流的类都是继承自InputStream和OutputStream。
关于 InputStream 和 OutputStream
执行InputStream和OutputStream的操作一般都意味着不断循环的将字节逐一从输入流读出或写入到输出流。你可以使用缓冲I/O流来降低I/O成本(凡是I/O请求都经常触发磁盘访问、网络动作或其他一些成本昂贵的操作)。缓冲输入流则是从缓冲的内存区域读取数据,只有缓冲读完才会调用native input API(不同操作系统提供的本地输入流API——译者注)。同样的,缓冲输出流也将数据写入缓冲,只有缓冲写满才会调用native output API。这些带缓冲的API很好的封装了未缓冲的流操作: BufferedInputStream 和 BufferedOutputStream.
上面一节主要是针对数据流,它提供一种数据读取和写入的简单模型。真实的数据流其实是涉及种类繁多的数据源和目的地,包括磁盘文件。但是,数据流并不支持所有磁盘文件操作。下面的链接介绍了非数据流的文件I/O:
类可以编写平台无关的检查和处理文件、目录的代码。
支持非序列化的磁盘文件数据访问。
java.net socket
两个在网络上运行的程序之间会建立双向通讯的链接,socket就是其中一个端点。Socket相关的类代表着客户端程序和服务端程序之间的连接。java.net包提供了两个类:Socket和ServerSocket。它们分别实现了连接的客户端和服务端。
客户端知道服务端运行机器的域名,以及服务器监听的端口,它尝试连接到服务器,如果一切正常,服务器接受并建立连接。当接受连接时,服务器在监听端口上绑定一个新的socket,并且通知远程端点设置客户端的地址和端口。之所以要建立一个新的socket是为了处理已连接客户端请求的同时还能继续监听原始socket上的连接请求。
服务器使用阻塞模式等待客户端连接:serverSocket.accept()是一个阻塞指令,当服务器等待接受连接时主线程不能做任何其他操作。由于这个原因,服务器想要达到多任务处理就只能通过实现一个多线程服务器:每当新建一个socket时就必须为它创建一个新线程。
I/O性能经常是一个现代应用的痛处。操作系统持续优化改进I/O性能,JVM也提供了一套运行环境帮助Java程序员规避了绝大多数操作系统I/O之间的差异。这些都让I/O相关编码更加高效和简单,但是却隐藏了操作系统的功能特性。想要增强I/O性能,其实你可以通过一些特殊的编码直接访问操作系统的底层功能,但是这并不是最佳解决方案——你的代码将必须依赖某个操作系统。 Java.nio包应运而生来解决这个难题,它提供了高性能的I/O特性,并支持当今大多数常用的商用操作系统。
JDK1.4的NIO包介绍了一系列新的I/O操作的抽象概念。
java.nio 概览
Java.nio这个新增的包实现了Java平台新的 I/O API。NIO API 包含如下特性:
原生类型数据缓冲
字符集的编码器和解码器
基于Perl风格正则表达式的模式匹配
通道(Channel),一种新的原生I/O抽象概念
支持锁和内存映射的文件接口
通过多路复用、非阻塞的I/O能力实现可伸缩的服务器架构
在SUN(现Oracle)的站点上可以找到java.nio的详细技术文档。这里我将解释一些nio的概念,并且和老的java.io库做下比较。建议不要把java.nio当作java.io的替代品,即使它是java.io的“扩展”。Nio的诞生导致了整个I/O类和接口的重新修订()。
NIO中一个最重要的概念是在非阻塞模式下运行,与传统Java I/O类库完全不同。什么是非阻塞模式?
Non blocking mode 非阻塞模式
一个I/O流的字节必须序列化的访问。各种设备,打印机端口、网络连接等都是常见的例子。
数据流通常比阻塞式设备慢,而且经常断断续续。大多数操作系统允许将数据流设置为非阻塞模式,允许进程检查是否流上是否有可用数据,即使没有也不会导致进程阻塞。这种机制能让进程在输入流空闲等待时执行其他逻辑,但是数据到达时又能及时处理。操作系统能够观察一堆的数据流并且指示其中哪些处于可用状态。通过观察这些可用状态,一个进程可以采用常用的编码和单个线程就能同时处理多个活动的数据流。这在网络服务器处理大量网络连接时被广泛使用。
Buffers 缓冲
从简单的入手,首先的改进是一系列java.io包中新建的缓冲类。这些缓冲提供了一个可以在内存容器中存储一堆原生类型数据的机制。一个缓冲对象是一个固定容量的容器,容器中的数据可以被读写。
所有的缓冲都是可读的,但并非都是可写的。每个缓冲类都实现了isReadOnly()方法来表示缓冲内容是否允许被修改。
缓冲需要配合Channel来使用。Channel是I/O传输的入口,缓冲则是数据传输的源头或目的地。在写入时,你想发送的数据首先被放入缓冲,接着被传递至一个Channel;在读取时,Channel负责接收数据,然后寄存至你提供的缓冲中。(比如在网络传输时的过程:用户数据——&发送端缓冲——&发送端Channel——&网络传输——&接收端Channel——&接收端缓冲——&用户数据,译者注)
Channel就像一个管道一样,将数据在管道两端的字节缓冲之间进行高效率的传输。它就像是一个网关,通过它可以用最小的成本来访问操作系统本地的I/O服务,而缓冲则是在两端内部的端点,Channel使用它来发送和接收数据。
Channel能在非阻塞模式下运行。一个非阻塞模式下的Channel不会让调用线程睡眠。请求的操作要么立刻完成、要么返回一个结果告知什么都没做。只有面向数据流的Channel,比如socket,能够在非阻塞模式下运行。在java.nio中的Channel包括FileChannel、ServerSocketChannel以及SocketChannel;这些都是为文件和socket管理所提供的特定的Channel。
FileChannel
FileChannel是可读可写的Channel,它必须阻塞,不能用在非阻塞模式中。面向数据流I/O的非阻塞风格并不适合面向文件的操作,因为文件I/O有本质上的区别。
FileChannel对象不能被直接创建。一个FileChannel实例只能通过在打开的文件对象(RandomAccessFile、FileInputStream、或FileOutputStream)上调用getChannel()得到。GetChannel()方法返回一个连接到相同文件的FileChannel对象,与文件对象拥有相同的访问权限。FileChannel对象是线程安全的。多线程能够并发的调用同一个实例上的方法而不会导致任何问题,但是并非所有操作是支持多线程的。影响Channel位置或者文件大小的操作必须是单线程的。
使用FileChannel,可以让拷贝等操作变成Channel到Channel的传输(transferTo()和transferFrom()方法),而且读写操作更易于使用缓冲。
SocketChannel
SocketChannel与FileChannel不同:新的Socket Channel能在非阻塞模式下运行并且是可选择的。不再需要为每个socket连接指派线程了。使用新的NIO类,一个或多个线程能管理成百上千个活动的socket连接,只用到很小甚至0的性能损失。使用Selector对象可以选择可用的Socket Channel。
有3个Socket Channel类型:SocketChannel, ServerSocketChannel, 以及 DatagramC SocketChannel和DatagramChannel是可读可写的,ServerSocketChannel 监听到来的连接,并且创建新的SocketChannel 对象。所有这些SocketChannel初始化时会创建一个同等的socket对象(java.net sockets)。这个同等的socket能从Channel对象上调用socket()方法获取。每个Socket Channel (in java.nio.channels)对象拥有一个相关的java.net.socket对象,反之并非所有的socket对象拥有相关的Channel对象。如果你使用传统方式创建一个socket对象,直接初始化它,它将不会拥有一个相关的Channel对象,它的getChannel()方法会返回null。
Socket Channel能在非阻塞模式下运行。传统Java Socket阻塞的本性曾经是影响Java应用可伸缩性的罪魁祸首之一。而基于非阻塞I/O则构建了很多复杂巧妙的、高性能的应用。设置或重置Channel的阻塞模式很简单,只要调用configureBlocking()即可。
非阻塞socket常在服务器端使用因为它能让同时管理多个socket变得简单。
Selector 选择器
选择器(Selector)提供了挑选可用状态Channel的能力,从而实现多路复用的I/O。我下面的例子将很好的解释选择器的优势:
设想你在一个火车站(non-selector,非选择器场景),有3个平台 (channels), 每个平台都有火车到达(buffer,缓冲)。每个平台上都有个管理员管理着到达的列车(worker thread,工作线程)。这是非选择器的场景。现在设想下选择器场景。有3个平台(channels),每个平台会有火车到达(缓冲),每个平台都有个指示器(比如一个响铃)指示着“火车到达”(selection key)。在这个场景下只有一个管理员就可以管理所有的3个平台。他只需查看指示器(selector.select())来判断是否有火车到达然后去处理一下到达的列车。
理解selector场景的优势很简单:一个单线程就可以实现多重任务处理的应用。除此之外,使用非阻塞选择器还能得到更多好处!设想火车管理员看着指示器时:他可以等待新的列车到达而不做其他事(使用selector.select()的阻塞模式);也可以在等待新的列车到达时(非阻塞模式使用selector.selectNow())去卖车票,这样selector就会返回null让线程执行其他代码逻辑。
IO vs. NIO
NIO使得I/O比传统I/O更加高效。在一个I/O操作占很高比例的程序中,想想看会有什么不同。比如,如果一个应用需要使用socket拷贝文件或者传输字节,使用NIO可能会得到更快的性能,因为它比I/O的API更接近操作系统。随着数据量的增大,性能提升将更可观。除了io API里,NIO还为数据流操作提供了其他的功能特性。但是,不可能用NIO取代IO,因为NIO的API是基于java.io之上扩展的功能。NIO通过扩展本地的IO API,为广大开发者使用更加强大的方式操作数据流带来了新的可能性。
英文原文:,编译: -
译文链接:
【如需转载,请在正文中标注并保留原文链接、译文链接和译者等信息,谢谢合作!】
关于作者:
现任支付宝架构师,负责监控分析域的架构和产品设计。架构时严谨,编码时疯狂。新浪微博:
秒杀还直接连数据库?怎么能这样设计?并发量一高数据库就挂了,肯定要走缓存的
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
新浪微博:
推荐微信号
反馈建议:@
广告与商务合作QQ:
– 好的话题、有启发的回复、值得信赖的圈子
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– UI,网页,交互和用户体验
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
& 2017 ImportNew

我要回帖

更多关于 比较盘和组合盘的区别 的文章

 

随机推荐