Java IO和NIO的区别(4大区别详解)

1.面向流与面向缓冲的区别

Java IO是面向流的I/O,提供了基于流的输入/输出模型,其中数据流通过一个流处理器一次一个字节地传输,使用此方法的I/O操作较慢。

如下图所示:

Java IO和NIO的区别(4大区别详解)-mikechen

相比之下,Java NIO API引入了基于通道和缓冲区的输入/输出模型,Java NIO是面向缓存的I/O方法。

Java NIO将数据读入缓冲器,使用通道进一步处理数据, 在NIO中,使用通道和缓冲区来处理I/O操作。

如下图所示:

Java IO和NIO的区别(4大区别详解)-mikechen

 

2.阻塞与非阻塞的区别

Java IO的各种流是阻塞的,这意味着当线程调用write()或read()时,线程会被阻塞,这意味着,当一个线程在读取或写入数据时,它将被阻塞,直到操作完成为止。

阻塞IO的优点是它可以使代码编写更简单和直观,不必实现复杂的异步操作,但是缺点是它可能会导致应用程序的性能问题,因为在等待数据时,线程会被阻塞并无法执行其他操作。

Java IO和NIO的区别(4大区别详解)-mikechen

Java NIO(New IO)提供了非阻塞IO操作的能力,与传统的Java IO操作不同,它允许在等待IO操作完成的同时执行其他任务。

非阻塞IO的工作原理是当读取或写入操作不能立即完成时,线程不会被阻塞,而是可以继续执行其他任务。

Java IO和NIO的区别(4大区别详解)-mikechen

线程将在后台轮询IO操作是否已完成,如果操作已完成,线程将恢复并继续进行读取或写入操作。

 

3.单线程和多线程的区别

Java I/O操作通常是单线程的,这意味着在一个线程中执行所有的读取和写入操作。

单线程模型的主要优点是简单和直观,因为所有的I/O操作都在同一个线程中执行,这使得代码易于编写和维护,特别是对于小型应用程序或者低负载的系统而言。

然而,单线程模型可能会导致应用程序的性能问题,特别是在高负载的情况下,当一个线程被阻塞等待I/O操作完成时,它不能执行其他任务,这可能导致应用程序响应变慢或者甚至崩溃。

Java NIO提供了一种多线程模型,在Java NIO多线程模型中,可以创建多个线程来执行I/O操作,这将减少I/O操作的等待时间并提高应用程序的性能。

Java NIO多线程模型的实现通常涉及以下几个方面:

1.选择器(Selector)

Java IO和NIO的区别(4大区别详解)-mikechen

选择器用于使用单个线程处理多个通道,因此,它需要较少的线程来处理这些通道。

因为线程之间的切换对于操作系统来说是昂贵的,因此,为了提高系统效率选择器是有用的。

 

2.工作线程(Worker Thread)

工作线程负责执行实际的I/O操作,每个工作线程通常处理多个连接,可以采用线程池来管理工作线程。

 

3.缓冲区(Buffer)

Java NIO中的缓冲区通常是线程安全的,这使得多个线程可以同时访问同一个缓冲区,而不需要担心线程安全问题。

 

4.传统IO与新NIO的区别

Java  I/O是传统的IO模型,NIO的N,也可以理解为New IO模型,也就是新的IO模型。

总之,Java NIO API提供了一种更快、更灵活和可伸缩的方式来处理输入/输出操作,特别适用于需要高性能和高吞吐量的网络应用程序。

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

评论交流
    说说你的看法