我看到Java NIO非常复杂。我们可以从实现Java NIO目的的Java IO创建......吗?
我认为很容易实现面向缓冲区和非阻塞IO - 这是Java NIO的两个主要特性。我们可以将数据从流读取到缓冲区而不是立即处理它们。关于非阻塞IO,我们可以使用Java IO的setSoTimeout方法允许线程在一段时间(例如100ms)之后放弃等待。基于此,我们可以创建一个处理多个连接的线程。
如果像上面那样容易,那么Java NIO是多余的吗?
答案 0 :(得分:2)
乍一看,您提出的解决方案似乎可行。但是,它只是一个模拟,并且永远不会像实际的NIO实现那样高效。
原因是NIO的工作方式与Java IO完全不同。这个“高级”部分需要操作系统的支持。当您只处理少量数据时,10毫秒与60毫秒的差别不大。但正如其他人所说的那样,需要10秒而不是1分钟的I / O会让世界变得不同。
还有其他一些细微之处。套接字超时与等待数据不同。异步I / O不一定使用很多线程。通常,每个硬件设备一个线程就足够了。没有等待。上下文切换较少。尽可能有效地处理数据,如果可以避免,则不包括将数据从一个缓冲区复制到另一个缓冲区。最后,这一切都加起来。