java的nio是什么,下面关于java nio提供了与标准io不同的io工作方式

  java的nio是什么,下面关于java nio提供了与标准io不同的io工作方式

  首先,NIO的概念是新IO。这个库是JDK1.4才引入的,NIO的功能和用途和IO一样,只是实现方式不同。NIO主要使用块,所以NIO的效率比IO高很多。Java API中提供了两套NIO,一套用于标准I/O NIO,另一套用于网络编程NIO。

  二。NIO和IO之间的主要区别下表总结了Java IO和NIO之间的主要区别:

  1.面向流和面向缓冲的Java IO和NIO的第一个最大区别是IO是面向流的,NIO是面向缓冲的。Java面向流意味着一次从流中读取一个或多个字节,直到所有字节都被读取,并且它们不被缓存在任何地方。此外,它不能来回移动流中的数据。如果需要来回移动从流中读取的数据,首先需要将其缓存到缓冲区中。Java NIO的面向缓冲区的方法略有不同。数据被读入缓冲区供以后处理,如果需要,可以在缓冲区中来回移动。这增加了过程中的灵活性。但是,您还需要检查缓冲区是否包含您需要处理的所有数据。此外,必须确保当更多数据读入缓冲区时,缓冲区中未处理的数据不会被覆盖。

  2.阻塞和非阻塞IOJava IO的各种流被阻塞。这意味着当一个线程调用read()或write()时,该线程会被阻塞,直到读取了一些数据或者数据被完全写入。在此期间,线程不能做任何其他事情。Java NIO的非阻塞模式使得一个线程发送一个从通道读取数据的请求,但它只能获得当前可用的数据。如果目前没有数据可用,它将不会获得任何东西,而不是保持线程被阻塞,因此线程可以继续做其他事情,直到数据变得可读。非阻塞写入也是如此。一个线程请求向一个通道写入一些数据,但是它不需要等待数据被完全写入。线程可以同时做其他事情。通常线程利用非阻塞IO的空闲时间在其他通道上执行IO操作,所以现在一个线程可以管理多个输入输出通道。

  3.选择器)Java NIO的选择器允许单线程监控多个输入通道。您可以注册多个通道来使用选择器,然后使用单线程来“选择”通道:这些通道已经有可以处理的输入,或者选择准备写入的通道。这种选择机制使得单线程管理多个通道变得很容易。

  三。NIO和IO如何影响应用程序的设计。无论您选择IO工具箱还是NIO工具箱,它都可能影响应用程序设计的以下方面:

  1.对NIO或IO类的API调用。

  2.数据处理。

  3.用于处理数据的线程数。

  1.API调用。当然,使用NIO的API调用看起来与使用IO的API调用不同,但这并不意外,因为数据不是从InputStream中一个字节一个字节地读取,而是必须在处理之前读入缓冲区。

  2.纯NIO设计用于数据处理。与IO设计相比,数据处理也受到影响。

  在IO设计中,我们从InputStream或Reader中逐字节读取数据。假设您正在处理基于行的文本数据流,例如:

  姓名:安娜

  年龄:25电子邮件:anna@mailserver.com

  电话:1234567890该文本行的流可以这样处理:

  InputStream输入=.//从客户端套接字获取InputStream

  buffered reader reader=new buffered reader(new InputStreamReader(input));

  string name line=reader . readline();

  string age line=reader . readline();

  string email line=reader . readline();

  string phone line=reader . readline();请注意,处理状态由程序的执行时间决定。换句话说,一旦reader.readLine()方法返回,你就知道肯定的文本行已经被读取,readLine()会一直阻塞,直到整行都被读取,这就是原因。你也知道这次旅行包含姓名;同样,当第二个readline()调用返回时,您知道这一行包含年龄等。如您所见,该处理程序仅在读入新数据时运行,并且知道每一步的数据是什么。一旦正在运行的线程处理了一些读入的数据,线程就不会回滚这些数据(大多数情况下)。下图也说明了这一原理:

  NIO的实现将会有所不同。这里有一个简单的例子:

  byte buffer buffer=byte buffer . allocate(48);int bytes read=in channel . read(buffer);注意第二行,从通道读取字节到ByteBuffer。当这个方法调用返回时,您不知道您需要的所有数据是否都在缓冲区中。如你所知,这个缓冲区包含一些字节,这使得它有点难以处理。假设第一次read(buffer)调用后,读入缓冲区的数据只有半行,例如“Name:An”。你能处理这些数据吗?显然,您必须等到整行数据都读入缓存。在此之前,对数据的任何处理都是没有意义的。那么,如何知道缓冲区是否包含足够处理的数据呢?好吧,你不知道。的发现方法只能查看缓冲区中的数据。因此,您必须多次检查缓冲区中的数据,才能知道所有数据都在缓冲区中。这样不仅效率低,而且程序设计也很乱。例如:

  byte buffer buffer=byte buffer . allocate(48);int bytes read=in channel . read(buffer);而(!bufferFull(字节读取)){

  bytes read=in channel . read(buffer);

  }bufferFull()方法必须跟踪有多少数据被读入缓冲区,并根据缓冲区是否已满返回true或false。换句话说,如果缓冲区准备好被处理,这意味着缓冲区已满。

  bufferFull()方法扫描缓冲区,但是在调用bufferFull()方法之前,它必须保持相同的状态。否则,下一个读入缓冲区的数据可能无法读取到正确的位置。这是不可能的,但这是另一个需要注意的问题。

  如果缓冲区已满,则可以对其进行处理。如果在你的实际案例中不满意,有意义,也许可以处理一部分数据。但很多情况下并非如此。下图显示“缓冲数据循环就绪”:

  四。摘要NIO允许您仅用一个(或几个)单线程来管理多个通道(网络连接或文件),但代价是解析数据可能比从阻塞的流中读取数据更复杂。

  如果您需要管理成千上万的同时连接,这些连接每次只发送少量的数据,比如聊天服务器,那么实现NIO的服务器可能是一个优势。同样,如果您需要维护许多到其他计算机的开放连接,如P2P网络,使用单线程管理所有出站连接可能是一种优势。一个螺纹的多重连接设计方案如下图所示:

  Java NIO:多个连接的单线程管理。如果您有少量使用非常高带宽的连接,并且一次发送大量数据,那么典型的IO服务器实现可能会非常合适。下图说明了典型的IO服务器设计:

  Java IO:典型的IO服务器设计——一个连接由一个线程处理。版权归作者所有:原创作品来自博主小二上九8,转载请联系作者授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: