JAVA NIO概念详解

Java NIO(New I/O)是Java平台提供的一组用于高效处理I/O操作的API。相较于传统的Java I/O(java.io)API,Java NIO提供了更加灵活、高效的非阻塞I/O操作方式。主要一些概念如下。

缓冲区(Buffer)

Java NIO中的I/O操作是基于缓冲区的。缓冲区实质上是一个固定大小的内存块,用于存储数据。它可以作为数据的源或目标,在通道(Channel)和数据源之间进行传输。

缓冲区(Buffer)是一个核心概念,用于存储数据,并作为数据源或目标在通道(Channel)和数据源之间进行传输。下面是对Java NIO缓冲区的详细解释:

缓冲区基本概念

 缓冲区实质上是一个固定大小的内存块,可以存储不同类型的数据(例如字节数据或字符数据)。它具有容量(Capacity)、上界(Limit)、位置(Position)和标记(Mark)等属性。

  • 容量(Capacity):缓冲区的容量表示它可以存储的最大数据量,一旦创建后不可更改。
  • 上界(Limit):上界表示缓冲区中当前有效数据的末尾位置,初始时与容量相等,通过设置上界可以控制读写操作的范围。
  • 位置(Position):位置表示下一个要读取或写入数据的索引位置,初始时为0,通过读写操作可以逐渐增加。
  • 标记(Mark):标记是一个可选属性,用于记录位置的备份,在某些操作中可以用来恢复位置的值。

缓冲区类型:

Java NIO提供了多种类型的缓冲区,以适应不同类型数据的存储需求,包括:

  • ByteBuffer:字节缓冲区。
  • CharBuffer:字符缓冲区。
  • ShortBuffer:短整型缓冲区。
  • IntBuffer:整型缓冲区。
  • LongBuffer:长整型缓冲区。
  • FloatBuffer:浮点型缓冲区。
  • DoubleBuffer:双精度浮点型缓冲区。

缓冲区的读写操作

缓冲区提供了一组读写操作,用于从缓冲区中读取数据或将数据写入缓冲区。这些操作包括:

  • put():将数据写入缓冲区。
  • get():从缓冲区中读取数据。
  • flip():将写模式切换为读模式,设置上界为当前位置,位置重置为0。
  • rewind():重置位置为0,保持上界不变,可重复读取缓冲区中的数据。
  • clear():清空缓冲区,设置位置为0,上界为容量,用于准备写入新的数据。
  • compact():将未读取的数据移到缓冲区的开始位置,位置设置为未读取数据的末尾,上界保持不变。

直接缓冲区和非直接缓冲区

Java NIO提供了直接缓冲区和非直接缓冲区两种类型。

直接缓冲区:直接缓冲区使用操作系统的本地内存进行存储,可以提供更快的数据传输速度。

非直接缓冲区:非直接缓冲区使用Java堆内存进行存储,通过Java堆与本地内存之间的拷贝进行数据传输。

通道(Channel)

通道表示与数据源之间的连接,可以是文件、网络套接字等。通道类似于流(Stream),但与流不同的是,通道可以进行双向数据传输。

通道(Channel)是连接数据源和缓冲区之间的桥梁,用于进行数据的读取和写入操作。通道类似于传统的流(Stream),但提供了更加灵活和高效的非阻塞 I/O 操作方式。下面是对Java NIO通道的详细解释:

通道基本概念

通道表示数据源和缓冲区之间的连接,可以是文件、网络套接字等。通道提供了一种双向数据传输的能力,可以用于读取和写入数据。在Java NIO中,通道是使用特定的数据类型进行操作的,例如ByteBuffer、CharBuffer等。

通道的分类

Java NIO中的通道主要分为两类:文件通道(FileChannel)和网络通道(SocketChannel、ServerSocketChannel、DatagramChannel)。其中,文件通道用于文件的读写操作,而网络通道用于网络的读写操作。

文件通道(FileChannel)

文件通道用于对文件进行读写操作。可以通过调用Java NIO库中的FileChannel.open()方法来获取文件通道的实例。文件通道提供了一组方法用于读取和写入数据,例如读取、写入字节数据,获取文件的大小、位置等。

网络通道(SocketChannel、ServerSocketChannel、DatagramChannel)

网络通道用于进行网络的读写操作。在Java NIO中,提供了SocketChannel用于客户端与服务器之间的连接,ServerSocketChannel用于服务器接收客户端连接,DatagramChannel用于进行UDP数据报的读写操作。网络通道支持非阻塞I/O操作,可以与选择器(Selector)一起使用,实现多路复用和高性能的网络编程。

通道的读写操作

通道提供了一组用于读取和写入数据的方法。例如,可以使用read()方法从通道中读取数据到缓冲区,使用write()方法将缓冲区中的数据写入到通道。此外,还可以使用还可以使用transferFrom()和transferTo()方法实现通道之间的数据传输。

通道的关闭和释放

在使用完通道后,应该显式地调用通道的close()方法来关闭通道,释放相关的资源。通道关闭后,将无法再进行读写操作。

选择器(Selector)

选择器是Java NIO中的一个重要组件,它可以用于监控多个通道的状态,并在通道就绪时进行处理。通过选择器,可以使用较少的线程处理多个通道的I/O操作,提高系统的性能和响应性。

监控多个通道(Channel)的状态,并在通道就绪时进行处理。选择器与非阻塞I/O操作一起使用,可以实现单线程处理多个通道的I/O操作,提高系统的性能和响应性。下面是对Java NIO选择器的详细解释:

选择器基本概念

选择器是一个对象,可以注册到一个或多个通道上,用于监控这些通道的状态变化。选择器能够检测到通道是否已经准备好进行读取或写入操作,以及是否发生了异常等。

选择器的创建

可以通过调用Selector.open()方法创建一个选择器的实例。

通道的注册

将一个通道注册到选择器上,可以通过调用通道的register()方法完成。在注册时,需要指定要监控的事件类型,例如读取事件(SelectionKey.OP_READ)、写入事件(SelectionKey.OP_WRITE)等。

选择器的轮询

选择器通过调用select()方法进行轮询,检查注册在其上的通道是否发生了所关注的事件。该方法会阻塞,直到至少有一个通道准备就绪,或者超时时间到达。

SelectionKey

当一个通道注册到选择器上时,会返回一个SelectionKey对象,表示该通道与选择器之间的关联。SelectionKey对象包含了通道、选择器、事件类型和附加的对象等信息。

就绪集合(Ready Set)

在每次轮询之后,选择器会返回一个就绪集合(Ready Set),包含了已经准备就绪的通道的SelectionKey。可以通过访问就绪集合来获取已经就绪的通道,进而进行相应的读写操作。

选择器的关闭

在使用完选择器后,应该显式地调用选择器的close()方法来关闭选择器,释放相关的资源。

通过选择器,可以使用较少的线程处理多个通道的I/O操作,提高系统的性能和响应性。

非阻塞I/O(Non-blocking I/O)

Java NIO提供了非阻塞I/O操作方式,使得应用程序可以在等待数据准备好时继续执行其他任务,而不需要一直阻塞等待。非阻塞I/O操作通常与选择器一起使用。

缓冲区操作

Java NIO中的缓冲区提供了灵活的数据操作方式,例如读取和写入数据、查找数据、截取数据等。缓冲区支持直接缓冲区和非直接缓冲区两种类型。

文件操作

Java NIO中提供了一些用于文件操作的类,例如文件通道(FileChannel),可以实现文件的读取和写入操作。通过文件通道,可以高效地操作大文件和内存映射文件。

网络操作

Java NIO中的网络操作可以实现非阻塞的网络通信。通过SocketChannel和ServerSocketChannel,可以建立客户端和服务器之间的连接,并进行读取和写入操作。此外,还可以使用Selector来实现同时处理多个客户端连接。

你可能感兴趣的:(java,NIO,spring,boot,java,后端)