📜  Java NIO-概述(1)

📅  最后修改于: 2023-12-03 15:15:57.327000             🧑  作者: Mango

Java NIO-概述

Java NIO(New IO,即新IO)是JDK 1.4中引入的一组IO API,用于代替Java标准IO API。NIO主要由以下两部分组成:

  • Buffer缓冲区:NIO中Buffer是一个对象,它包含一些要写入或者从中读取的数据。在NIO库中,所有数据都是用缓冲区处理的,数据需要先读到一个缓冲区,然后再从缓冲区中写入或者再读取。
  • Channel通道:NIO中的通道表示一个打开的连接,可执行两个运输方向:读取和写入。
NIO与IO的区别

NIO与IO最大的区别是IO是面向流(Stream Oriented),而NIO是面向缓冲区(Buffer Oriented)。Java IO面向流意味着每次从流中读取一个或多个字节,直至读取所有字节,没有缓存。而Java NIO的缓冲导向方法会使用一个缓存区,将数据从通道读取到缓存区中,或将数据从缓存区写入通道中。

由于可以在NIO与IO之间进行选择,因此可以根据应用程序要求将性能优化为您最关心的问题。IO的重点是面向流的方式,而NIO的重点是缓冲区导向的方式。

常见的NIO类和接口
  • Buffer:缓冲区用于存储一组原始类型数据,例如int、long、char和byte。Java NIO标准的缓冲区类的一个子类实例化后有三个重要的属性:容量(capacity),限制(limit)和位置(position)。
  • Channel:通道是对原有IO中的流的模拟,可以从通道读取数据或者将数据写入通道。所有通道都实现了Channel接口。
  • Selector:Selector允许单线程处理多个Channel。
NIO的应用场景

Java NIO通常用于需要处理并发连接的高性能网络应用程序。它在以下情况下非常适用:

  • 当需要同时处理成百上千个连接时,每个连接只占用单独的通道,这样只需要很少线程就可以轻松管理许多连接。
  • 应用程序需要保持许多打开的连接和轻量级数据结构,例如消息队列,缓存和定时器等。
  • 应用程序基于HTTP,实现HTTP的长连接方式。

以上应用场景中,Java NIO的好处显而易见:每个连接只占用一个单独的线程,因此开销相对较小,同时也能够轻松处理成百上千个连接。

示例代码
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NioApp {
    public static void main(String[] args) throws Exception {
        ByteBuffer buffer = ByteBuffer.wrap("Hello World".getBytes());
        SocketChannel channel = SocketChannel.open();
        channel.connect(new InetSocketAddress("www.google.com", 80));

        while(buffer.hasRemaining()) {
            channel.write(buffer);
        }

        channel.close();
    }
}

上面的代码展示了如何使用Java NIO向一个服务器发送数据。首先,创建一个ByteBuffer,然后将其包装到一个 SocketChannel 中。然后,将数据写入通道中,最后关闭通道。

这只是一个简单的示例,但这展示了Java NIO的一些原理:缓冲区和通道的使用。从这个例子中可以看出,Java NIO的编程不像传统IO那样直观,但从性能的角度来看,Java NIO确实是一个非常强大的库。