NIO(New IO)和IO(Input/Output)的主要区别在于它们的设计理念、性能和使用的模型。
1. 设计理念:
IO:传统的IO是基于阻塞的。这意味着当一个线程发起一个IO操作时,它会一直等待直到操作完成。在等待期间,线程无法执行其他任务。
NIO:NIO是基于非阻塞的。它使用一个选择器(Selector)来处理多个通道(Channel),这样线程就可以在等待某个通道操作完成时执行其他任务。
2. 性能:
IO:由于IO是阻塞的,因此当处理大量并发IO操作时,性能会受到影响。
NIO:由于NIO的非阻塞特性,它可以更高效地处理并发IO操作。
3. 使用的模型:
IO:使用传统的文件流(如FileInputStream、FileOutputStream)和Socket流(如SocketInputStream、SocketOutputStream)。
NIO:使用通道(Channel)和缓冲区(Buffer)进行操作。通道是用于IO操作的对象,缓冲区是数据传输的容器。
4. 线程模型:
IO:通常需要为每个连接创建一个线程,这在处理大量并发连接时可能会导致资源耗尽。
NIO:可以使用一个或几个线程来处理多个连接,因为NIO的非阻塞特性允许一个线程处理多个通道。
以下是一个简单的例子,展示了如何使用NIO进行文件读取:
```java
FileChannel fileChannel = new FileInputStream("example.txt").getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while (fileChannel.read(buffer) > 0) {
buffer.flip();
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());