为什么需要Java NIO

时间:2014-06-18 11:54:02

标签: java nio

我想知道作为Java NIO的一部分提供的最有前途的功能是什么,这在早期的普通IO中并不存在。我已经知道以下差异:

Java IO         | Java NIOs
Stream oriented | Buffer oriented
Blocking IO     | Non blocking IO
                  Selectors

Java NIO大大简化了同时处理多个读/写线程的生活,但假设我有多个CPU /巨大的CPU能力,那么NIO优于普通IO的优势是什么。有人在一次采访中被问到,我尝试用上述几点来解释它,但答案对他来说似乎并不令人满意。

3 个答案:

答案 0 :(得分:1)

下表总结了Java NIO和IO之间的主要区别。我将在表格后面的部分中详细介绍每个区别。 IO是面向流的,阻塞IO,NIO是面向缓冲区和非阻塞IO

面向流的面向缓冲区

Java NIO和IO之间的第一个重要区别是IO是面向流的,其中NIO是面向缓冲区的。那么,这是什么意思?

面向流的Java IO意味着您可以从流中一次读取一个或多个字节。你对读取的字节做什么取决于你。它们不会缓存在任何地方。此外,您无法在流中的数据中前后移动。如果您需要在从流中读取的数据中前后移动,则需要先将其缓存在缓冲区中。

Java NIO的面向缓冲区的方法略有不同。数据被读入缓冲区,稍后处理该缓冲区。您可以根据需要在缓冲区中前后移动。这使您在处理过程中具有更大的灵活性。但是,您还需要检查缓冲区是否包含完整处理所需的所有数据。并且,您需要确保在将更多数据读入缓冲区时,不要覆盖尚未处理的缓冲区中的数据。 阻止与非阻塞IO

Java IO的各种流都是阻塞的。这意味着,当线程调用read()或write()时,该线程将被阻塞,直到有一些数据要读取,或者数据被完全写入。在此期间,该线程无法执行任何其他操作。

Java NIO的非阻塞模式允许线程请求从通道读取数据,并且只获取当前可用的内容,或者根本没有数据,如果当前没有数据可用。

可以继续使用其他内容,而不是在数据可供读取之前保持阻塞状态

非阻塞写作也是如此。线程可以请求将某些数据写入通道,但不要等待它完全写入。然后,线程可以继续并在同一时间执行其他操作。

在IO调用中未被阻止时,哪些线程花费空闲时间,通常在此期间在其他通道上执行IO。也就是说,单个线程现在可以管理多个输入和输出通道。 选择

Java NIO的选择器允许单个线程监视多个输入通道。您可以使用选择器注册多个通道,然后使用单个线程“选择”具有可用于处理的输入的通道,或者选择准备写入的通道。这种选择器机制使单个线程可以轻松管理多个通道。

答案 1 :(得分:1)

Java NIO

的巨大优势
  • Java NIO:管理多个连接的单个线程。在哪里
  • Java IO:经典的IO服务器设计 - 一个连接由一个thread.Source here
  • 处理

答案 2 :(得分:0)

可能只需要一些关键词:内存映射文件,非阻塞I / O&超时,听众,选择器的多个频道。