Java 面试题
目录

Java 中 NIO 的核心组件有哪些?(例如:Channel, Buffer, Selector)

· 约 3 分钟读完 · 第 48 / 274 章

推荐答案

Java NIO(Non-blocking I/O)的核心组件包括以下几个:

  1. Channel(通道):Channel 是 NIO 中用于数据传输的通道,类似于传统的流,但 Channel 是双向的,既可以读也可以写。常见的 Channel 实现类有 FileChannel、SocketChannel、ServerSocketChannel 和 DatagramChannel。

  2. Buffer(缓冲区):Buffer 是一个用于存储数据的容器,NIO 中的所有数据操作都是通过 Buffer 进行的。Buffer 是一个抽象类,常见的实现类有 ByteBuffer、CharBuffer、IntBuffer 等。

  3. Selector(选择器):Selector 是 NIO 中用于多路复用的组件,允许一个线程处理多个 Channel。Selector 可以监控多个 Channel 的事件(如连接、读、写等),并在事件发生时通知应用程序。

  4. Charset(字符集):Charset 用于在字节和字符之间进行转换。Java NIO 提供了 Charset 类来处理字符编码和解码。

本题详细解读

Channel(通道)

Channel 是 NIO 中用于数据传输的通道,与传统的 I/O 流不同,Channel 是双向的,既可以读也可以写。常见的 Channel 实现类包括:

  • FileChannel:用于文件读写。
  • SocketChannel:用于 TCP 网络通信。
  • ServerSocketChannel:用于监听 TCP 连接。
  • DatagramChannel:用于 UDP 网络通信。

Buffer(缓冲区)

Buffer 是一个用于存储数据的容器,NIO 中的所有数据操作都是通过 Buffer 进行的。Buffer 是一个抽象类,常见的实现类包括:

  • ByteBuffer:用于存储字节数据。
  • CharBuffer:用于存储字符数据。
  • IntBuffer:用于存储整数数据。
  • FloatBuffer:用于存储浮点数数据。
  • DoubleBuffer:用于存储双精度浮点数数据。

Buffer 的基本操作包括:

  • allocate(int capacity):分配一个指定大小的 Buffer。
  • put():向 Buffer 中写入数据。
  • get():从 Buffer 中读取数据。
  • flip():将 Buffer 从写模式切换到读模式。
  • clear():清空 Buffer,准备再次写入。

Selector(选择器)

Selector 是 NIO 中用于多路复用的组件,允许一个线程处理多个 Channel。Selector 可以监控多个 Channel 的事件(如连接、读、写等),并在事件发生时通知应用程序。

Selector 的基本操作包括:

  • open():创建一个 Selector。
  • register(Channel channel, int ops):将 Channel 注册到 Selector 上,并指定感兴趣的事件。
  • select():阻塞等待,直到有 Channel 上的事件发生。
  • selectedKeys():获取所有已就绪的事件。

Charset(字符集)

Charset 用于在字节和字符之间进行转换。Java NIO 提供了 Charset 类来处理字符编码和解码。常见的字符集包括 UTF-8、UTF-16、ISO-8859-1 等。

Charset 的基本操作包括:

  • forName(String charsetName):获取指定字符集的实例。
  • encode(CharBuffer cb):将字符数据编码为字节数据。
  • decode(ByteBuffer bb):将字节数据解码为字符数据。