文章摘要: 为输入输出提供缓冲区的类。
介绍
简要说明
- 提供用于高性能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:所有缓冲区的超类,提供了一系列用于数据存取的方法。ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBufferMappedByteBuffer
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:用于异步通道的分组管理。