JAVA_18

JAVA_18

  • 1.IO流
  • 2.JAVA_IO流
  • 3.标准输入输出
  • 4.对象序列化
  • 5.字符编码与字符集
  • 6.异常处理和资源关闭
  • 7.NIO、BIO、AIO
    • 1. IO回顾:
    • 2. BIO(Blockingl/O):
    • 3. NIO(Newl/O):
    • 4. AIO(AsynchronousI/O):


1.IO流

  1. IO流(Input/Output stream)是用于在程序和外部设备(如文件、网络等)之间进行数据传输的机制。它是Java中处理输入和输出操作的一种抽象方式。
  2. 概念:
    输入流(Input Stream):用于从外部设备(如文件、网络等)读取数据到程序中的
    流。
    输出流(Output Stream):用于将程序中的数据写入外部设备(如文件、网络等)的流。
  3. 作用:
    通过使用IO流,程序可以与外部环境进行数据交换,从而实现数据的读取和写入。
    IO流提供了一种统一的方式来处理不同类型的数据源和目标,使得程序的编写更加灵活和可扩展。
    IO流可以处理各种不同类型的数据,包括文本、二进制、对象等。
    IO流提供了一些高级功能,如缓冲、字符编码转换、对象序列化等,使数据传输更高效、安全和可靠。
  4. 在Java中,IO流分为字节流和字符流两种类型。
    字节流:字节流以字节为单位进行数据传输。它们适用于处理二进制数据(如图像、音频等)或与外部设备进行底层交互(如读写文件、网络通信)。
    字符流:字符流以字符为单位进行数据传输。它们适用于处理文本数据,提供了更方便的字符处理方法,可以自动进行字符编码转换。
  5. Java提供了一组I0流类来处理不同的输入和输出需求,例如:
    字节流:InputStream、OutputStream、FilelnputStream、FileOutputStream等。
    字符流:Reader、Writer、FileReader、FileWriter等。
  6. 通过使用这些类,可以实现从文件读取数据、向文件写入数据、与网络进行数据交互等操作。
    总而言之,IO流在Java中扮演着重要的角色,它们提供了一种方便、灵活和可靠的方式来处理输入和输出操作,使得Java程序可以与外部环境进行数据交换和通信。

2.JAVA_IO流

  1. 在Java中,IO流根据数据的类型进行分类,主要分为字节流(ByteStreams)和字符流(Character Streams)。

字节流(Byte Streams):字节输入流(InputStream):用于从数据源(如文件、网络)读取字节数据。它以字节为单位进行读取,适用于处理二进制数据(如图像、音频等)或与底层设备进行交瓦。
字节输出流(OutputStream):用于将字节数据写入目标(如文件、网络)。它以字节为单位进行写入,适用于向文件或网络发送二进制数据。@字符流(Character Streams):
字符输入流(Reader):用于从数据源读取字符数据,并提供字符处理的能力。它
以字符为单位进行读取,适用于处理文本数据。
字符输出流(Writer):用于将字符数据写入目标,并提供字符处理的能力。它以字符为单位进行写入,适用于向文件或网络发送文本数据。

字节流和字符流的区别在于处理的数据类型和提供的功能。字节流以字节为单位进行读取和写入,适用于处理二进制数据和底层设备交豆。字符流以字符为单位进行读取和写入,提供了更方便的字符处理方法,适用于处理文本数据。
在使用IO流时需要根据数据的特性选择合适的流类型。如果处理的是二进制数据,如图像或音频文件,则使用字节流。如果处理的是文本数据,如读取文本文件或与用户交互,则使用字符流。
Java提供了一系列字节流和字符流的类,如FilelnputStream、FileOutputStream、FileReader、FileWriter等,开发者可以根据需求选择合适的流类进行数据的读取和写入操作。此外,还可以通过转换流(如InputStreamReader和OutputStreamWriter)在字节流和字符流之间进行转换。
2. 字节流与字符流
InputStream和OutputStream是Java中用于处理字节流的抽象类。它们提供了一组用于读取和写入字节数据的方法。下面详细介绍这两个类的使用:
① InputStream类:
InputStream是抽象类,不能直接实例化,但有许多具体的子类可用。
常见的InputStream子类包括FileInputStream(从文件读取)ByteArrayInputStream(从字节数组读取)、SocketlnputStream(从网络套接字读取)等。
通过调用子类的构造函数,可以创建相应的InputStream对象。Inputstream提供了以下常用方法:

int read():从流中读取一个字节数据,并返回读取的字节值(0-255),若已到达流的未尾,则返回-1。
intreadlbyte[] bufen) :从流中最多读取buffer长度的字节数据,并将其存储到给定的字节数组中,返回实际读取的字节数。
void close0 :关闭流并释放相关的系统资源。

② OutputStream类:
OutputStream也是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的OutputStream子类包括FileOutputStream(写入文件)ByteArrayOutputStream(写入字节数组)SocketOutputStream(写入网络套接字)等。
通过调用子类的构造函数,可以创建相应的OutputStream对象。
OutputStream提供了以下常用方法

void write(intb):将指定的字节写入流中。
void write(byteūbufer):将给定字节数组中的数据写入流中。
void close(): 关闭流并释放相关的系统资源。
void nush0: 刷新流,将缓冲区中的数据立即写入目标。

请注意,在使用InputStream和OutputStream时,需要正确处理I0异常并在不再需要流时及时关闭流以释放资源。为了确保流的自动关闭,可以使用Java 7引入的try-with-resources语句,它会自动处理资源的关闭操作。
3. Reader和Writer类的功能和用法
Reader和Writer是]ava中用于处理字符流的抽象类。它们提供了一组用于读取和写入字符数据的方法。下面详细介绍这两个类的功能和用法
① Reader类:
Reader是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的Reader子类包括FileReader(从文件读取字符数据)、StringReader(从字符串读取字符数据)、BufferedReader(提供缓冲功能)、InputStreamReader(将字节流转换为字符流)等。
通过调用子类的构造函数,可以创建相应的Reader对象。
Reader提供了以下常用方法:

int read():从流中读取一个字符,并返回读取的字符的Unicode值,若已到达流的末尾,则返回-1。
int read(char[] bufen):从流中最多读取buffer长度的字符数据,并将其存储到给定的字符数组中,返回实际读取的字符数。
void close():关闭流并释放相关的系统资源,

② Writer类:
Writer也是抽象类,不能直接实例化,但有多个具体的子类可用。
常见的Writer子类包括FileWriter(写入文件)、StringWriter(写入字符串)、BufferedWriter(提供缓冲功能)、OutputStreamWriter(将字节流转换为字符流)等。
通过调用子类的构造函数,可以创建相应的Writer对象。
Writer提供了以下常用方法:

void write(int c):将指定的字符写入流中。
void write(char[] buffer):将给定字符数组中的数据写入流中
void write(String data):将给定字符串写入流中。
void close():关闭流并释放相关的系统资源。
void flush():刷新流,将缓冲区中的数据立即写入目标。

同样地,在使用Reader和Writer时,需要正确处理I0异常并在不再需要流时及时关闭流以释放资源。也可以使用try-with-resources语句来自动关闭流。
值得注意的是,Reader和Writer处理的是字符数据,因此适用于处理文本文件或与用户交互的场景,而不适用于处理二进制数据。如果需要处理二进制数据,请使用InputStream和OutputStream类。
3. 文件读写
在Java中,可以使用File类来创建和删除文件。

BufferedInputStream和BufferedOutputStream类的优势
BufferedInputStream和BufferedOutputStream是Java中用于提供缓冲功能的流类,它们是对InputStream和OutputStream的包装。它们具有以下优势:
① 提高读写效率:BufferedInputStream和BufferedOutputStream使用内部缓冲区,可以减少与底层输入输出流的直接交互次数,从而提高读写效率。相对于直接使用底层流,使用缓冲流可以减少对底层存储设备的频繁访问,减少读写操作的开销。
② 减少系统调用次数:缓冲流在底层流的基础上引入了缓冲区,可以一次性读取或写入较大的数据块。这减少了底层系统调用的次数,降低了系统开销,提高了读写性能。
③ 自动缓冲处理:BufferedlnputStream和BufferedOutputStream类自动处理数据的缓冲,无需手动管理缓冲区。它们提供了一组读写方法,将数据从底层流读入缓冲区或将数据从缓冲区写入底层流,开发者无需手动编写循环读取和写入的代码。
④ 适用于文本和二进制数据:缓冲流既适用于处理文本数据,也适用于处理二进制数据。无论是读取或写入文本文件,还是读取或写入二进制文件(如图像、音频文件),都可以使用缓冲流来提高读写效率。

3.标准输入输出

  1. System.in和System.out是]ava中的标准输入流和标准输出流,它们提供了与命令行界面进行交互的功能。
    System.in:
    System.in是标准输入流,用于从控制台(通常是命令行界面)读取用户的输入。
    System.in是一个InputStream对象,可以使用InputStream的方法来读取用户的输入。
    通过System.in,程序可以等待用户的输入,并将输入的数据用于程序的处理。
    System.out:
    System.out是标准输出流,用于向控制台输出程序的结果、提示信息等
    System.out是一个PrintStream对象,可以使用PrintStream的方法将数据输出到控制台。
    通过System.out,程序可以将结果、信息等输出到控制台,以供用户观看.
    使用Scanner类可以方便地从标准输入(如控制台)获取用户的输入。

4.对象序列化

Serializable接口的作用:
Serializable接口是]ava中的一个标记接口(MarkerInterface),它没有定义任何方法,只是作为一个标识,用于表朗类的对象可以被序列化和反序列化。
序列化是将对象转换为字节序列,以便在网络传输或将对象存储到文件系统中。而反序列化则是将字节序列恢复为对象。
Serializable接口的作用如下:
① 对象持久化:通过实现Serializable接口,可以使类的对象可以被序列化,即可以将其保存到文件、数据库等持久化存储介质中。这样,在程序终止后,对象的状态可以被保留下来,下次程序运行时可以重新加载对象。
② 网络通信:在网络通信中,将对象序列化后发送给其他计算机,接收方可以将字节流反序列化为对象。这样可以方便地进行分布式计算、远程方法调用等操作。
③ 分布式系统:在分布式系统中,各个节点之间需要传递数据和对象,通过序列化和反序列化,可以在不同的节点间传输和共享对象。
④ 对象深拷贝:通过将对象序列化然后再反序列化,可以实现对象的深拷贝,即创建一个全新的对象,与原对象完全独立。
要实现Serializable接口,只需在类的声明上加上mmdlemenrs senaleo,并且不需要实现任何方法。需要注意的是,被序列化的类的所有非瞬态(ansient)字段都会被序列化,因此应谨慎选择需要序列化的字段
需要注意的是,Serializable接口并不建议用于敏感数据、密码、安全密钥等信息的序列化,因为序列化的数据可以在网络上传输或存储在不受信任的环境中。在这种情况下,应考虑其他安全手段,如加密、签名等来保护数据的安全性。
总而言之,Serializable接口为Java对象的序列化和反序列化提供了支持,使对象在持久化、网络通信和分布式系统中的传输和共享更加便捷。
使用0bjectOutputstream和ObjectlnputStream类可以对Java对象进行序列化和反序列化。

5.字符编码与字符集

  1. 字符编码的概念和重要性
    字符编码是一种将字符映射为二进制数据的规则或方案。它定义了字符与二进制数据之间的对应关系,使计算机能够处理和存储文本数据。字符编码在计算机系统中起着重要的作用。
    概念:
    字符集(Character Set):字符集是一组字符的集合,每个字符都有一个唯一的标识符。常见的字符集包括ASCI1、Unicode等
    编码方案(EncodingScheme):编码方案定义了字符集中的字符如何映射为二进制数据。它规定了字符的表示形式和编码方式。
    重要性:
    文本处理:字符编码使得计算机能够处理和表示文本数据。通过字符编码,可以在计算机中存储、传输和处理各种语言的文本,包括英语、中文、日语等。不同的字符编码方案支持不同的字符集和语言。
    兼容性和互操作性:字符编码的标准化有助于实现不同计算机系统、操作系统和应用程序之间的兼容性和互操作性。统一的字符编码方案使得文本数据可以在不同的环境中无缝传递和处理。
    多语言支持:Unicode是一种广泛使用的字符编码标准,它支持几乎所有的语言和符号。Unicode的出现解决了传统字符编码方案的局限性,使得多语言文本处理变得更加便捷。
    国际化和本地化:字符编码对于实现软件的国际化和本地化非常重要。通过选择适当的字符编码,软件可以适应不同语言和地区的需求,支持多语言界面、本地化的日期、时间和数字格式等。
    常见的字符编码方案包括ASCI、UTF-8、UTF-16、GBK、ISO-8859-1等。选择合适的字符编码方案要考虑数据的特点、传输和存储需求、目标环境等因素。在处理文本数据时,确保正确的字符编码非常重要,否则可能导致乱码、字符丢失或无法正确解析文本。
    当需要处理不同字符编码方式的文本时,可以使用Java中的InputstreamReader 和Outputstreamwriter 类来进行转换和处理。

6.异常处理和资源关闭

  1. IO流中的常见异常并提供解决方案
    在IO流操作中,常见的异常包括IOException 及其子类。以下是几个常见的IO流异常和解决方案:
    ① FileNotFoundException(文件未找到异常):当尝试打开或读取一个不存在的文件时抛出。
    解决方案:
    确保文件路径和文件名的正确性。
    检查文件是否存在,可以使用 File.exists( 方法。
    确保具有足够的权限来访问文件。
    如果需要创建文件,可以使用 File.createNewFile( 方法。
    ② IOException(输入输出异常):当读取或写入数据时发生错误时抛出。
    解决方案:
    检查输入和输出流是否正确初始化和关闭。.
    确保在使用流之前检查流的状态,例如通过 inputstream.availabe()方法检查是否有可读数据。
    检查文件和目录的权限,确保有适当的读取和写入权限。
    处理异常情况,例如使用 ty-catch 语句捕获和处理 I0Exception 。

7.NIO、BIO、AIO

1. IO回顾:

  1. I/O概念:
    I/O代表输入出是计算机领域中用于描述计算机系统与外部环境之间校换数据的过程计算机系统通过1/0来与外部设备(如键盘、鼠标、显示器、磁盘、网络等)进行交互,实现数据的输入和输出。I/0是计算机系统中非常重要的部分,它使得计机可以处理和响应用户的输入,并将结果输出给用户或其他外部设备。
    输入(lnput): 输入是指从外部设备向计算机系统传输数据或信息。例如,当用户通过键盘输入文本,鼠标点击图标,或者通过网络接收数据时,这些都属于输入操作。输入数据被计算机系统接收后,可以进行处理、存储、展示等操作。
    输出(output): 输出是指从计算机系统向外部设备传送数据或信息。例如,计算机将处理后的数据显示在屏幕上、打印在纸张上,或者通过网络发送数据给其他计算机等,都属于输出操作。输出使计算机的处理结果能够被用户或其他设备看到或使用。
    I/O设备: I/O设备是指计算机系统与外部环境进行数据交换的各种硬件设备。常见的I/O设备包括键盘、鼠标、显示器、打印机、硬盘、USB设备、网络接口卡等。这些设备通过I/0控制器与计算机系统连接,允许数据在计算机和设备之间进行输入和输出。
    I/O操作: I/O操作是指计算机系统进行输入和输出数据的过程。I/O操作涉及到数据的传输、存储、缓冲、同步、异步等处理。I/O操作可以分为同步和异步两种方式:
    同步I/O:在执行I/O操作时,程序会一直等待操作完成后再继续执行后续代码。
    异步I/O:在执行I/O操作时,程序不会被阻塞,可以继续执行其他代码,在I/0操作完成后通过回调或事件通知来处理结果。
    I/O缓冲: I/O缓冲是一种将数据暂时存储在内存中的技术,用于优化IO性能。I/O缓冲区允许系统在完成大量数据传输后一次性进行I/O操作,从而减少频繁的IO访问。常见的I/0缓冲技术包括文件缓冲、网络缓冲等。
    总体而言,I/O是计算机系统与外部世界进行数据交换的重要方式,是计算机系统运行和应用的基础。了解和优化I/O操作对于提高计算机性能、响应速度和用户体验至关重要。
  2. I/O处理中的常见问题和挑战
    缓冲区溢出:读取或写入的数据量,从而导致数据溢出缓冲区的边界。当缓冲区溢出发生时,额外的数据将超出缓冲区的范围,并可能覆盖其他内存区域,导致数据的损坏或程序崩溃。
    缓冲区溢出可能由以下原因引起:
    读取数据量超过缓冲区大小:当从输入流读取数据时,如果一次读取的数据量超过了缓冲区的大小,可能会导致缓冲区溢出。
    写入数据量超过缓冲区大小:当向输出流写入数据时,如果一次写入的数据量超过了缓冲区的大小,也可能会导致缓冲区溢出。
    数据丢失:数据丢失是指在进行数据传输或处理过程中,部分或全部数据未能被正确地传输或处理,而是被丢失或遗漏。数据丢失可能导致数据不完整或缺失,造成程序的错误结果或无法恢复的损失。
    数据丢失可能由以下原因引起:
    数据传输错误:在网络通信或文件传输过程中,由于网络拥堵、通信错误或硬件问题数据包可能丢失或损坏,导致数据丢失。
    处理错误:在数据处理过程中,如果程序逻辑错误或数据处理错误,可能导致部分或全部数据被错误地处理或丢弃。
  3. I/O操作的性能瓶颈
    硬件性能: 硬件的性能限制是I/O操作的主要瓶颈之一。例如,磁盘的读写速度、网络带宽、外部设备的响应时间等,都会影响I/O操作的速度和效率。当硬件的性能不能满足应用程序的需求时,I/O操作可能会变得很慢。
    磁盘访问时间: 磁盘访问时间包括寻道时间、旋转延迟和传输时间。寻道时间是指磁头移动到所需数据的位置所需的时间,旋转延迟是指等待所需数据旋转到磁头下方所需的时间,传输时间是指数据从磁盘传输到内存的时间。磁盘访问时间通常较长,特别是对于传统机械硬盘而言,这会成为I/O操作的瓶颈。
    磁盘I/O队列:在高并发环境中,磁盘可能面临大量的I/O请求,这些请求会形成一个I/O队列。磁盘I/O队列可能导致I/O请求的等待时间增加,从而降低整体I/O操作的性能。
    网络延迟: 在进行网络通信时,网络延迟是一个重要的性能因素。网络延迟包括数据在网络中传输所需的时间和处理时间。高延迟会导致网络I/O操作的速度变慢,特别是在远程通信和跨越多个网络节点的情况下。
    数据拷贝: 在进行数据传输时,涉及数据拷贝的过程。例如,从磁盘读取数据到内存需要进行一次数据拷贝,然后再将数据从内存传输到网络或其他设备也需要进行数据拷贝。
    线程阻塞: 在某些1/0操作模型中,比如阻塞I/0模型,当进行1/0操作时,程序会被阻塞,无法继续执行其他代码。这会导致CPU资源被浪费,从而影响整体系统的性能。
    为了优化I/0操作的性能,可以采取以下策略:
    使用高性能硬件:使用高速磁盘、高带宽网络和响应快速的外部设备,提升硬件性能。
    数据缓存:通过缓存机制减少对硬盘的频繁访问,加速数据读写。
    异步I/0:采用非阻塞I/0或异步I/0模型,充分利用系统资源,提高并发性能。
    数据压缩和加速:采用数据压缩和加速技术,减少数据传输时间和带宽消耗。
    使用专用线程:为I/0操作使用专用的线程池,避免I/0操作阻塞主线程,
    数据局部性:提高数据局部性,减少对非局部数据的访问,从而提高缓存命中率,
    优化I/0操作的性能需要综合考虑硬件、软件和应用程序的各个方面,以最大程度地减少性能瓶颈,提升系统的整体性能。

2. BIO(Blockingl/O):

  1. 理解BIO的基本概念和工作原理:
    BIO是阻塞I/0的一种实现方式,它使用传统的同步方式进行1/0操作。在进行BI0操作时,当执行一个I/O操作时,程序会一直等待操作完成后再继续执行后续代码,即程序在执行I/O操作期间会被阻塞。只有当I/O操作完成后,程序才能继续往下执行。在这里插入图片描述
  2. 特点:
    阻塞式: BIO是一种阻塞型的I/0模型,当执行一个BI0操作时,如果操作不能立即完成,程序将被阻塞(挂起)直到操作完成。这意味着在执行BI0操作期间,程序无法做其他事情,需要一直等待。
    同步方式: BIO以同步的方式处理I/0操作,即程序必须等待I/0操作完成才能继续执行后续代码。这意味着程序的执行顺序与I/0操作的完成顺序是一致的。
    逐个处理连接: 在BIO模型中,每个连接都需要单独的线程来处理。当有大量连接请求时,需要创建大量的线程来处理,这可能会导致系统资源的浪费和性能下降。
    适用于少量连接: 由于每个连接需要一个独立的线程来处理,BIO适用于处理少量的连接和数据传输。在高并发环境下,BIO的性能可能不如其他!/O模型。
    适用场景: BIO适用于简单的I/0场景,特别是在连接数较少目对实时性要求不高的情况下。例如,用于创建简单的服务器或处理简单的文件读写操作。在一些简单的网络通信场景下,BIO也可以胜任,但在高并发的网络服务器中,BIO的性能不如其他更高级的I/O模型(如NIO或AIO)。
    尽管BIO在某些特定场景下仍然有一定的应用,但随着互联网和分布式计算的发展,更多的应用程序转向使用NIO(非阻塞I/O)或AIO(异步I/O)等更为高效的I/O模型来处理大量并发连接和数据传输。
  3. BIO中的阻塞行为
    连接阻塞: 在BIO模型中,当服务器需要处理客户端的连接请求时,服务器Socket会调用 accept() 方法等待客户端的连接。如果没有客户端连接请求到达,accept() 方法会一直阻塞,直到有客户端连接请求到达为止。这会导致服务器程序在没有连接请求时一直处于阻塞状态。
    读取阻塞: 在BIO模型中,当服务器需要从客户端读取数据时,服务器Socket会调用read() 方法来读取数据。如果当前没有数据可供读取,read( 方法会一直阻塞,直到有数据到达为止。这意味着服务器程序在没有可读数据时会一直阻塞在读取操作上。
    写入阻塞: 在BI0模型中,当服务器需要向客户端写入数据时,服务器Socket会调用wite() 方法进行写入操作。如果当前无法立即写入数据(例如客户端的接收缓冲区已满),wite() 方法会一直阻塞,直到数据能够成功写入为止。这会导致服务器程序在无法写入数据时一直阻塞在写入操作上。
    总结来说,BIO模型中的阻塞行为主要体现在 accept()、read()和 write() 等I/O操作上。在进行这些操作时,程序会等待操作完成,直到有数据到达或数据能够成功写入为止。这种阻塞行为使得BIO模型在高并发环境中表现不佳,因为每个连接都需要单独的线程来处理,当有大量连接时,会导致线程资源的浪费和性能下降。因此,在高并发场景下,通常会选择使用更高效的I/O模型,如NIO或AIO,来避免阻塞行为带来的性能问题。

3. NIO(Newl/O):

  1. NIO的基本概念和核心组件:
    NIO(New 1/0)是java中提供的一种基于Channel和Buffer的I/O模型,它是传统的BIO(Blocking l/0)的一种改进。NIO在JDK 1.4中引入,提供了更高效、更灵活的I/0操作方式,适用于构建高性能、高并发的网络应用和其他I/0密集型应用。
    在这里插入图片描述
  2. NIO与传统的BIO相比,优势在于:
    非阻塞模型:NIO支持非阻塞I/0操作,可以在一个线程内同时管理多个通道,减少了线程切换开销,提高了系统的吞吐量和响应性能。
    选择器:通过Selector,可以监控多个通道上的事件,当有事件发生时,再进行处理避免了无谓的轮询操作,提高了效率。
    通道间传输:NIO支持直接在通道之间传输数据,不需要中间缓冲区,避免了数据的多次复制。
    Charset支持:NIO提供了更方便的字符编码和解码支持,更好地处理字符数据。
    总的来说,NIO适用于高性能、高并发的网络应用和其他I/0密集型应用,特别适合处理大量并发连接和高吞吐量的场景。
  3. 核心组件:
    Channel(通道):NIO中的 channel类代表了一个连接到实体(例如文件、套接字)的开放连接,类似于传统I/O中的流。它支持非阻塞模式,可以注册到选择器上,以实现多路复用。
    Buffer(缓冲区): NIO中的 Bufer 是一个对象数组,它持有数据元素。每种基本数据类型(如byte、int、char等)都有相应的缓冲区。缓冲区提供了一系列的方法来方便数据的读写操作。
    Selector(选择器): selector 是NIO中的关键组件,用于多路复用。一个单独的线程可以通过 selector 来监听多个通道上的事件,例如连接是否可读、可写等。这样就可以在-个线程中管理多个通道,提高并发连接的处理性能。
    SelectionKey(选择键):selectionKey是 selector 和 channe! 之间的关联对象,用于表示特定通道在特定选择器上的注册状态。通过 selectionkey 可以获取通道的事件类型,从而进行相应的处理。
    在NIO中,通过将通道、缓冲区和选择器组合使用,可以实现高效的非阻塞I0操作。NIO适用于需要处理大量并发连接的场景,例如网络通信服务器、聊天室、实时消息推送等。由于NIO的非阻塞特性,它可以充分利用系统资源,避免线程阻塞问题,因此在高并发场景下具有优势。
  4. 通道和缓冲区在NIO中的作用
    在NIO(New 1/0)中,通道(Channel)和缓冲区(Buffer)是两个核心概念,它们在NIO的非阻塞I/0模型中扮演着重要的角色。
    通道(Channel)的作用:
    通道是NIO中进行I/0操作的对象,类似于传统I/O中的流(Stream),但有一些不同之处。通道代表了一个连接到实体(例如文件、套接字)的开放连接,它可以支持读和写操作,并且可以通过非阻塞模式进行操作。通道提供了一个可以注册到选择器(Selector)上的接口,实现了NIO的多路复用特性。通过通道,可以在一个线程中管理多个通道,提高并发连接的处理性能。
    通道的主要作用:
    提供非阻塞I/0操作:通道可以在非阻塞模式下工作,从而允许单线程管理多个连接,避免线程阻塞问题。
    支持多路复用:通过将通道注册到选择器上,可以在一个线程中监听多个通道上的事件,实现了NIO的多路复用机制。
    可以通过缓冲区进行数据的读写:通道本不保存数据,而是通过缓冲区来进行数据的传输。
    缓冲区(Buffer)的作用:
    缓冲区是NIO中的一个核心概念,用于进行数据的读写。所有的数据都需要先写入到缓冲区,然后再从缓冲区读取出来。缓冲区是一个对象数组,它持有数据元素,例如字节缓冲区(ByteBuffer)、字符缓冲区(CharBuffer)等。缓冲区提供了一系列的方法来方便数据的读写操作,包括将数据写入缓冲区和从缓冲区读取数据。
    缓冲区的主要作用:
    存储数据:缓冲区是一个内存块,用于存储数据,数据可以是字节、字符等各种类型。
    简化数据传输:通过缓冲区,可以将数据从通道写入到缓冲区,然后再从缓冲区读取出来,实现数据的传输和处理。
    提供数据处理接口:缓冲区提供了一系列的方法来方便数据的读写操作,例如 put0 方法3用于写入数据到缓冲区,get() 方法用于从缓冲区读取数据。
    通过通道和缓冲区的组合使用,NIO可以实现高效的非阻塞I/0操作。数据从通道写入到缓冲区,然后再从缓冲区读取出来进行处理,这种方式避免了传统I0中的阻塞问题,提高了系统的并发性能。
  5. 理解NIO的非阻塞特性和事件驱动模型
    在NIO(New I0)中,非阻塞行为是指I/0操作不会阻塞当前线程,即在进行I/0操作时程序可以继续执行其他任务,而不必等待IO操作的完成。这是与传统的BI0(BlockingI/0)模型最大的不同之处。NIO的非阻塞行为是通过以下机制实现的:
    通道(Channel)的非阻塞模式: NIO的通道支持非阻塞模式,通过将通道设置为非阻-塞模式,可以在进行I/0操作时立即返回,而不是等待操作完成。在非阻塞模式下,如果通道当前没有数据可读或没有空间可写,读取和写入操作将返回零或空,而不是一直阻塞等待。
    缓冲区(Buffer)的非阻塞读写:在非阻塞模式下,缓冲区的读取和写入操作是立即返2回的,即使缓冲区当前没有数据可读或没有空间可写,操作也不会阻塞,而是立即返回相应的状态。
    选择器(Selector)的多路复用: NIO的选择器是实现非阻塞的关键组件。通过将通道注册到选择器上,一个单独的线程可以同时监听多个通道上的事件。当一个或多个通道上有事件发生时(如读就绪、写就绪等),选择器会返回通道的选择键(SelectionKey),从而通知程序哪些通道可以进行I/0操作。这样可以实现单线程管理多个通道,避免了传统BIO中一个连接一个线程的模式,从而充分利用系统资源。
    非阻塞行为的优势在于可以在一个线程中处理多个连接,避免了线程的创建和销毁开销,减少了线程间的切换开销,提高了系统的并发性能和吞吐量。这使得NIO适用于高并发和大规模连接的场景,例如网络服务器、聊天室、实时消息推送等。
    需要注意的是,NIO的非阻塞行为需要程序主动处理非阻塞状态,通过选择器监听通道的事件,并在通道就绪时进行相应的处理。非阻塞模型需要程序员对1/0操作有一定的控制和处理能力,因此相对于传统BIO模型,编程难度稍高。但是,对于性能要求较高的应用场景NIO的非阻塞模型带来的性能提升是非常显著的。
    NIO(New I/0)的事件驱动模型是NIO非阻塞I/0的核心概念,它是实现高并发的关键。在传统的阻塞式I/0模型(BI0)中,每个连接都需要一个独立的线程来处理,当连接数量增加时,线程数量也会相应增加,导致系统资源的浪费和性能下降。而NIO的事件驱动模型通过选择器(Selector)来解决这个问题。
    NIO事件驱动模型的核心组件是选择器(Selector)和通道(Channel)。通道可以注册到选择器上,当通道发生I/0事件时(例如可读、可写等),选择器会通知程序,然后程序可以对相应的事件进行处理,而无需为每个连接创建一个线程。
  6. 比较NIO与BIO的性能和使用场景
    NIO(New1/0)和BI0(Blocking I/0)是]ava中用于处理I/0操作的两种不同模型,它们在不同场景下有不同的性能表现和适用性。下面对比NIO和BIO在不同场景下的特点:
    1.性能表现:
    在低并发的情况下,BIO的性能通常是可以接受的。然而,当并发连接数增加时,每个连接都需要一个独立的线程来处理,导致线程数量激增,严重影响性能。在高并发场景下,BIO往往会因为线程阳塞和上下文切换等问题导致性能急剧下降。
    NIO性能表现: NIO的性能在高并发场景下通常优于BI0。NIO使用选择器(Selector)实现了非阻塞I/0,可以通过一个线程处理多个连接,避免了线程数量过多的问题。这使得NIO适用于高并发和大规模连接的场景,性能相对较好。
    2.适用性:
    BIO适用性: BIO适用于低并发的场景,如单连接的服务器或客户端。由于每个连接都需要一个独立的线程,因此BIO在面对大量并发连接时表现不佳。但对于简单的小规模应用,BIO的编程模型相对简单,容易理解和实现。
    NIO适用性: NIO适用于高并发的场景,如网络服务器、聊天室、实时消息推送等。由于NIO的非阻塞特性,可以充分利用系统资源,避免线程阻塞问题,因此在高并发场景下具有优势。但相对于BIO,NIO的编程模型较为复杂,需要更多的编程技巧和经验。

4. AIO(AsynchronousI/O):

  1. AI0的异步特性和工作原理:
    AIO(Asynchronous l/0)是Java NIO的一个扩展,它引入了异步特性,与传统的NIO以及BIO有很大的不同。AIO是在)DK7中引入的,通过Asynchronouschanne和AsynchronousFilechannel等类来支持异步1/0操作。
    在这里插入图片描述
    异步特性:
    在传统的NIO中,虽然可以通过选择器(selector)实现非阻塞I/0操作,但仍然需要在代码中显式地调用读取或写入方法来进行数据的传输。而AI0引入了异步I/0操作,允许程序在发起I/0操作后,继续执行其他任务,而不需要等待I0操作的完成。当I/0操作完成时,操作系统会通知应用程序,然后程序可以处理已完成的结果。这样,在I/0操作的等待过程中,线程可以继续处理其他任务,提高了系统的并发性能。
  2. 工作原理:
    AIO的异步特性是通过回调机制实现的。在进行AIO操作时,应用程序需要提供一个回调函数(completionHandler),用于在操作完成后处理结果。当I/0操作完成时,操作系统会通知应用程序,并调用回调函数来处理已完成的结果。
  3. AIO性能表现:
    AIO的性能在高并发场景下通常也优于BI0。AI0引入了异步I/0操作和回调机制,允许应用程序在进行I0操作时继续执行其他任务,避免了线程阻塞和上下文切换。这使得AIO适用于高并发的复杂场景,能够更高效地利用系统资源,性能相对较好。
    AIO适用性:
    AIO适用于高并发的复杂场景,尤其是需要处理大量并发连接的网络应用。AIO的异步特性允许应用程序在进行I/0操作时继续执行其他任务,避免了线程阳和上下文切换,进一步提高了并发性能。与NIO相比,AIO编程模型可能更加复杂,需要更多的经验和技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1681.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

提升大数据量分页查询性能:深分页优化全解

前言 在处理数据量逐渐增大的数据库表时,优化查询性能是一个常见的挑战。朋友们可能会建议说,创建索引不就能解决问题了吗?然而,当数据量达到相当规模时,简单的索引可能不足以应对所有情况。这时,可能会有…

多用户商城系统的架构与实现

随着互联网的迅猛发展,电子商务逐渐成为一种主流的商业模式。多用户商城系统作为一种新兴的商业平台,旨在为多个商家和用户提供一个互利共赢的交易环境。本文将深入探讨多用户商城系统的架构、实现及其在商业中的应用。 一、什么是多用户商城系统&#x…

[SpringBoot]浏览器输出中文乱码问题解决

问题情境: IDEA、Springboot、浏览器访问接口查看返回的JSON数据,发现中文乱码 解决方案: server:servlet:encoding:charset: UTF-8enabled: trueforce: true 如果你的配置文件不是yml格式,可以参考下面这个:

第4章 Linux必备命令

Linux系统启动默认为字符界面,一般不会启动图形界面,所以对命令行的熟练程度能更加方便、高效的管理Linux系统。 本章介绍Linux系统必备命令各项参数及功能场景,Linux常见命令包括:cd、ls、pwd、mkdir、rm、cp、mv、touch、cat、head、tail、chmod、vim等。 4.1 Linux命令…

统信UOS适配C#

通过Mono或.NET Core等运行时,在UOS上进行C#应用开发、编译、调试及部署变得便捷。 文章目录 一、环境部署1. C#开发环境安装2. C#开发环境配置二、 C#开发案例三、常见问题1. 图形界面支持2. 调试工具一、环境部署 1. C#开发环境安装 统信UOS V20使用dotnet 7.0 amd64版本,…

和鲸科技同南京大学地理与海洋科学学院签署和鲸“101 数智领航计划”合作协议,助力“地理海洋科学+AI”人才培养

2024 年 10 月 24 日,上海和今信息科技有限公司(以下简称“和鲸科技”)同南京大学地理与海洋科学学院召开合作洽谈会,会上,和鲸科技社区合伙人唐铭与南京大学地理与海洋科学学院副院长金晓斌正式签署和鲸“101 数智领航…

大模型,多模态大模型面试问题【P-tuning,VAE,梯度累加,秩,混合精读训练,SVM,softmax,LoRA】

大模型,多模态大模型面试问题【P-tuning,VAE,梯度累加,秩,混合精读训练,SVM,softmax,LoRA】 问题一:P-tuning源码,参数怎么加的!问题二:VAE的V是什么回事,相对于AE做出的改进。问题三:梯度累加是解决什么问…

OpenCV视觉分析之目标跟踪(7)目标跟踪器类TrackerVit的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 VIT 跟踪器由于特殊的模型结构而变得更快且极其轻量级,模型文件大约为 767KB。模型下载链接:https://github.com/opencv/…

网络安全到底是什么?看完你就懂了(附学习资料)

一、什么是网络安全? “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行,网络服务不中断。” 说白了网络安全就是维护网络系统上的信息安全。 信息…

LeetCode - 685. 冗余连接 II

. - 力扣(LeetCode) 题目 在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。 输入一个…

1-磁盘建立空闲分区

学习目标: 掌握磁盘分区的基本知识和操作技能,能够独立创建和管理磁盘空闲分区,以优化存储空间和提高系统性能,为后续的系统安装和数据管理打下基础。 学习内容: 1 选择一个适合的磁盘分区软件。推荐DiskGenius、Par…

文件系统(IO-进程-线程)

目录 IO 同步/异步/阻塞/非阻塞/BIO/NIO/AIO 阻塞IO模型 非阻塞IO模型 多路复用IO模型 异步IO模型 IO模型总结 零拷贝 传统的文件传输有多糟糕? 使用零拷贝技术的项目 进程 进程的控制结构 什么是线程? 线程与进程的比较 IO模型 Java IO…

QT中客户端 服务器

客户端 对于我们网络编程中 客户端 服务器,Q的步骤 那在我们qt当中 因为qt是基于我们面向对象的编程 首先我们需要一个socket 就是QTcpSocket 我们需要从我们editline中获取我们输入的ip地址跟端口号 就是QString ip ui->editline->text(); 获取之后利用我们soc…

第三次RHCSA作业

1、配置网络:为网卡添加一个本网段IPV4地址,x.x.x.123 2、配置yum本地仓库,并完成traceroute命令的安装 yum库配置成功过后,显示这个报错,没能写完 3、用至少两种方法查看sshd服务的进程号 4、添加一块10G大小的磁盘&…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤:1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网:https://www.rabbitmq.com/docs 二、开发步骤:…

Windows达梦8数据库:本地编码:PG_GBK, 导入文件编码:PG_UTF8错误最优解决方法

在windows使用达梦8DM管理工具直接导入.dmp文件(可能是从Linux导出的)时出现该错误 错误如下 解决方案如下: 1、重新建立UTF-8编码的数据库 2、新建一个模式 3、使用CMD 命令进行导入 找到DM数据库的安装路径的bin 目录下 cmd 进入终端,使用命令&…

【含文档】基于ssm+jsp的传统文化学习系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: apache tomcat 主要技术: Java,Spring,SpringMvc,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统主要有管…

计算机网络:网络层 —— 网际组管理协议 IGMP

文章目录 IP多播协议网际组管理协议IGMPIGMP的三种报文类型IGMP的基本工作原理加入多播组监视多播组的成员变化多播路由器发送IGMP成员查询报文多播组成员发送IGMP成员报告报文多播路由器移除多播组成员注意事项 退出多播组 IP多播协议 要在因特网上进行IP多播,就必…

每日读则推(十四)——Meta Movie Gen: the most advanced media foundation models to-date

premiere n.首映,首次公演 v.首次公演(戏剧、音乐、电影) a.首要的,最早的 Today we’re premiering Meta Movie Gen: the most advanced media foundation models to-date. 迄今,到现在为止 …

使用Deno进行现代Web开发

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 [TOC] 引言 Deno 是一个现代的、安全的、基于 V8 引擎的 JavaScript 和 TypeScript 运行时,由 Node.js 的作者 Rya…