魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • Language - Java - Java SE - API - 「java.nio」

文章摘要: 为输入输出提供缓冲区的类。

介绍

简要说明

  • 提供用于高性能I/O操作的API。
  • 包含了一套新的抽象,如缓冲区(Buffers)、通道(Channels)和选择器(Selectors),这些抽象支持非阻塞I/O操作,是Java New I/O API的核心。

主要功能

  • 缓冲区(Buffers):提供了一组用于存储不同数据类型的容器,如ByteBuffer、CharBuffer等,这些缓冲区是通道读写数据的中介。
  • 通道(Channels):代表打开到I/O设备(如文件、套接字等)的连接。通道用于从缓冲区读取数据或将数据写入缓冲区。
  • 选择器(Selectors):用于监控多个通道的事件(如连接、接受、读取、写入),使得单个线程可以管理多个通道,适用于实现多路复用、非阻塞I/O。
  • 文件系统(FileSystems):提供了访问文件系统的高级API,支持文件属性的查询和修改,以及文件系统的遍历。

注意事项

  • 内存管理:在使用缓冲区时,需要注意内存分配和释放,避免内存泄漏。
  • 线程安全:缓冲区不是线程安全的,多线程操作同一缓冲区时需要外部同步。
  • 性能影响:非阻塞I/O可以提高应用程序的性能,但同时也增加了编程的复杂性。
  • 正确的资源关闭:使用完通道和其他资源后,应该正确地关闭它们以释放系统资源。

适用场景

  • 高性能网络编程:使用NIO实现非阻塞网络通信,适用于需要高并发处理的网络应用。
  • 文件处理:使用NIO的文件通道和文件属性视图进行高效的文件读写操作。
  • 大规模数据处理:当需要处理大量数据时,NIO的缓冲区可以提供更高效的数据传输方式。
  • 需要非阻塞I/O的场景:在需要同时处理多个I/O操作而不希望为每个操作创建一个线程时,NIO的选择器非常有用。

主要组件

Channels

通道是用于 I/O 操作的途径,与传统的流不同,通道是双向的,可以用于读写操作。

  • FileChannel: 用于文件的数据读写。
  • SocketChannel: 用于 TCP 网络的数据读写。
  • ServerSocketChannel: 监听 TCP 连接请求,并为每个请求创建一个 SocketChannel。
  • DatagramChannel: 用于 UDP 网络的数据读写。

Buffers

缓冲区是数据的容器,用于与通道进行数据交换。

  • ByteBuffer: 最常用的缓冲区,可以存储字节数据。
  • CharBuffer, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer, DoubleBuffer: 用于存储不同类型的数据。

Selectors

选择器用于检查一个或多个通道是否准备好进行 I/O 操作,是支持非阻塞 I/O 的核心。

Files

Files 类提供了大量用于操作文件和文件系统的静态方法。

主要类和方法

ByteBuffer

  • allocate(int capacity): 分配一个新的字节缓冲区。
  • flip(): 切换读写模式,将缓冲区的 limit 设置为 position,position 设置为 0。
  • clear(): 清空缓冲区,准备下一次读写操作。
  • rewind(): 重置 position 为 0,limit 保持不变。
  • remaining(): 返回当前位置和限制之间的元素数。

FileChannel

  • read(ByteBuffer dst): 从通道读取数据到缓冲区。
  • write(ByteBuffer src): 从缓冲区写入数据到通道。
  • position(): 返回通道的当前位置。
  • size(): 返回通道所关联文件的大小。
  • transferFrom(ReadableByteChannel src, long position, long count): 从给定通道传输数据到这个通道。
  • transferTo(long position, long count, WritableByteChannel target): 从这个通道传输数据到给定的通道。

Selector

  • open(): 打开一个选择器。
  • select(): 选择一组键,其相应的通道已准备好进行 I/O 操作。
  • selectedKeys(): 返回此选择器的已选择键集。

Files

  • readAllBytes(Path path): 读取整个文件内容到字节序列。
  • write(Path path, byte[] bytes, OpenOption... options): 将字节序列写入文件。
  • newBufferedReader(Path path, Charset cs): 打开一个用于读取文本文件的缓冲字符输入流。
  • newBufferedWriter(Path path, Charset cs, OpenOption... options): 打开一个用于写入文本文件的缓冲字符输出流。
  • copy(Path source, OutputStream out): 将文件内容复制到输出流。
  • walk(Path start, FileVisitOption... options): 遍历文件树。

学习总结

  • 非阻塞I/O: java.nio 提供的非阻塞 I/O 特性允许单个线程管理多个通道,从而提高性能。
  • 通道和缓冲区: 通道用于传输数据,缓冲区用于存储数据。通道的所有读写操作都是通过缓冲区来完成的。
  • 内存映射文件: FileChannel 支持内存映射文件,可以非常高效地读写文件内容。
  • 文件系统操作: Files 类提供了丰富的文件操作方法,包括文件读写、复制、遍历等。
  • 选择器: 选择器用于实现多路复用 I/O,可以在单个线程中处理多个通道。
  • 性能: 相比于传统的基于流的 I/O,java.nio 可以提供更高的性能,尤其是在处理大量数据时。
  • 安全性: 使用 java.nio 时需要注意资源管理和异常处理,以避免资源泄露和错误处理。

java.nio.channels

定义通道,这些通道表示与能够执行 I/O 操作的实体(例如文件和套接字)的连接;定义选择器,用于多路复用、非阻塞 I/O 操作。

java.nio.channels.spi

java.nio.channels Service-provider 类。

java.nio.charset

定义字符集、解码器和编码器,用于在字节和 Unicode 字符之间进行转换。

java.nio.charset.spi

java.nio.charset Service-provider 类。

java.nio.file

定义 Java 虚拟机访问文件、文件属性和文件系统的接口和类。

java.nio.file.attribute

提供对文件和文件系统属性的访问的接口和类。

java.nio.file.spi

java.nio.file Service-provider 类。

cache

Path

Paths

// 相对路径
Path source = Paths.get("x1.txt");
// 绝对路径
Path source = Paths.get("/home/user/x1.txt");
// 目录拼接,代表 /home/user/x1.txt
Path source = Paths.get("/home/user“, "x1.txt")

核心类和接口

  • Buffer:所有缓冲区的超类,提供了一系列用于数据存取的方法。

    • ByteBuffer
    • CharBuffer
    • ShortBuffer
    • IntBuffer
    • LongBuffer
    • FloatBuffer
    • DoubleBuffer
    • MappedByteBuffer
  • Channel:用于I/O操作的数据传输通道,类似于流。

    • FileChannel:用于文件的数据读写。
    • SocketChannel:用于TCP网络的数据读写。
    • ServerSocketChannel:用于监听TCP连接请求。
    • DatagramChannel:用于UDP网络的数据读写。
  • Selector:用于检查一个或多个NIO通道的状态是否准备好进行数据读写。

  • SelectionKey:表示SelectableChannel在Selector中注册的标记,包含了通道操作的状态和兴趣集合。

文件系统类和接口

  • Path:表示文件系统中的路径。
  • Paths:用于获取Path实例的工厂类。
  • Files:提供文件操作的方法,如读写、创建、删除等。
  • FileVisitor:用于文件遍历的访问者接口。
  • FileSystem:表示文件系统。
  • FileStore:提供文件存储区域的信息。
  • WatchService:用于监控文件系统事件。

网络类

  • Socket:表示网络套接字。
  • ServerSocket:用于监听客户端的套接字连接。
  • DatagramSocket:用于发送和接收UDP数据报包。

属性类

  • FileAttribute:用于配置文件系统的文件属性。
  • PosixFilePermission:用于POSIX文件权限。

其他类和接口

  • charset:用于字符集编码和解码。
  • StandardCharsets:提供标准字符集的常量。
  • FileSystemProvider:文件系统提供者的抽象类。
  • AsynchronousFileChannel:用于异步文件读写操作的文件通道。
  • AsynchronousSocketChannel:用于异步TCP套接字连接的数据读写。
  • AsynchronousServerSocketChannel:用于异步监听TCP连接请求。
  • AsynchronousChannelGroup:用于异步通道的分组管理。
更新时间: 2025/11/16 17:17