Java NIO Channels

2025年3月22日 | 阅读 3 分钟

在 Java NIO 中,Channel(通道)是一种高效地在实体和字节缓冲区之间传输数据的媒介。它从实体读取数据并将其放入缓冲区块以供消耗。

Channels 充当 Java NIO 提供的访问 I/O 机制的网关。通常,Channels 与操作系统文件描述符具有一对一的关系,以提供平台无关性的操作功能。

让我们来看一下 java.nio.channels: 的类层次结构:

Java Nio tutorial9

上面的 Channel 可以阻塞模式或非阻塞模式下使用,但我们主要关注在非阻塞模式下使用 Channel。

NIO Channel 基础

Channel 的实现使用本机代码来执行实际工作。Channel 接口允许我们以可移植且受控的方式访问底层 I/O 服务。

在层次结构的顶部,Channel 接口按如下方式使用:

正如我们在上面的 Channel 接口中看到的,所有 Channel 共有两个操作:

  • 检查 Channel 是否已关闭 (isclose())
  • 打开已关闭的 Channel (close())

Channel 实现

在 Java NIO 中,主要使用的 Channels 如下:

让我们来看一个创建 FileChannel 对象的示例:

  • FileChannel: FileChannel 用于从文件中读取数据。它的对象只能通过调用 getChannel() 方法创建。我们不能直接创建 FileChannel 对象。
  • DatagramChannel: DatagramChannel 可以通过 UDP (User Datagram Protocol) 在网络上读写数据。它使用工厂方法创建新对象。

打开 DatagramChannel 使用的语法:

关闭 DatagramChannel 使用的语法:

  • SocketChannel: SocketChannel 可以通过 TCP (Transmission Control Protocol) 在网络上读写数据。它也使用工厂方法创建新对象。

打开 SocketChannel 使用的语法:

关闭 SocketChannel 使用的语法:

  • ServerSocketChannel: ServerSocketChannel 允许用户监听传入的 TCP 连接,就像 Web 服务器一样。对于每个传入的连接,都会创建一个 SocketChannel。

打开 ServerSocketChannel 使用的语法:

关闭 ServerSocketChannel 使用的语法:


基本 Channel 示例

让我们看一个将数据从一个 Channel 复制到另一个 Channel 或从一个文件复制到另一个文件的示例:

输出

上面的程序将 textin.txt 文件的内容复制到另一个文本文件 testout.txt。

下一主题Java NIO Buffers