1.面向流与面向缓冲的区别
Java IO是面向流的I/O,提供了基于流的输入/输出模型,其中数据流通过一个流处理器一次一个字节地传输,使用此方法的I/O操作较慢。
如下图所示:
相比之下,Java NIO API引入了基于通道和缓冲区的输入/输出模型,Java NIO是面向缓存的I/O方法。
Java NIO将数据读入缓冲器,使用通道进一步处理数据, 在NIO中,使用通道和缓冲区来处理I/O操作。
如下图所示:
2.阻塞与非阻塞的区别
Java IO的各种流是阻塞的,这意味着当线程调用write()或read()时,线程会被阻塞,这意味着,当一个线程在读取或写入数据时,它将被阻塞,直到操作完成为止。
阻塞IO的优点是它可以使代码编写更简单和直观,不必实现复杂的异步操作,但是缺点是它可能会导致应用程序的性能问题,因为在等待数据时,线程会被阻塞并无法执行其他操作。
Java NIO(New IO)提供了非阻塞IO操作的能力,与传统的Java IO操作不同,它允许在等待IO操作完成的同时执行其他任务。
非阻塞IO的工作原理是当读取或写入操作不能立即完成时,线程不会被阻塞,而是可以继续执行其他任务。
线程将在后台轮询IO操作是否已完成,如果操作已完成,线程将恢复并继续进行读取或写入操作。
3.单线程和多线程的区别
Java I/O操作通常是单线程的,这意味着在一个线程中执行所有的读取和写入操作。
单线程模型的主要优点是简单和直观,因为所有的I/O操作都在同一个线程中执行,这使得代码易于编写和维护,特别是对于小型应用程序或者低负载的系统而言。
然而,单线程模型可能会导致应用程序的性能问题,特别是在高负载的情况下,当一个线程被阻塞等待I/O操作完成时,它不能执行其他任务,这可能导致应用程序响应变慢或者甚至崩溃。
Java NIO提供了一种多线程模型,在Java NIO多线程模型中,可以创建多个线程来执行I/O操作,这将减少I/O操作的等待时间并提高应用程序的性能。
Java NIO多线程模型的实现通常涉及以下几个方面:
1.选择器(Selector)
选择器用于使用单个线程处理多个通道,因此,它需要较少的线程来处理这些通道。
因为线程之间的切换对于操作系统来说是昂贵的,因此,为了提高系统效率选择器是有用的。
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」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》