Java基础 —— IO流详解

news2024/11/29 1:37:45

IO流

在Java中,IO(输入/输出)流是用于在程序与外部世界(如文件、网络、内存等)之间传输数据的机制。IO流分为两大类:输入流(InputStream/Reader)和输出流(OutputStream/Writer)。这些流抽象了数据的来源和去向,使得数据读写操作更加灵活和方便。
在这里插入图片描述
1. IO流概述

Java中的IO流是用于数据输入和输出的一系列类的集合,它基于数据流的概念,允许程序对数据源和目的地进行操作。Java IO流的设计遵循装饰者模式,通过在基本功能的基础上添加额外的功能来扩展其能力。

1.1 IO流的分类

Java IO流可以分为两大类:字节流和字符流。字节流用于处理二进制数据,而字符流则用于处理文本数据。

  • 字节流:基于字节的输入/输出操作,如FileInputStream和FileOutputStream,它们可以处理任何类型的数据,包括文本和非文本文件。
  • 字符流:基于字符的输入/输出操作,如FileReader和FileWriter,它们专门用于处理文本数据,并且提供了字符编码和解码的功能。

1.2 缓冲流

缓冲流是对基本的输入/输出流的增强,它们通过使用缓冲区来提高数据传输的效率。缓冲流包括BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter。

  • BufferedInputStream和BufferedOutputStream:它们分别对InputStream和OutputStream进行包装,提供了缓冲功能,可以减少实际的I/O操作次数。
  • BufferedReader和BufferedWriter:它们分别对Reader和Writer进行包装,提供了缓冲功能,使得文本数据的读取和写入更加高效。

1.3 转换流

转换流包括InputStreamReader和OutputStreamWriter,它们用于在字节流和字符流之间进行转换。

  • InputStreamReader:它将字节流转换为字符流,允许程序读取文本数据并根据指定的字符集进行解码。
  • OutputStreamWriter:它将字符流转换为字节流,允许程序写入文本数据并根据指定的字符集进行编码。

1.4 序列化与反序列化

Java IO流还支持对象的序列化和反序列化,这是通过ObjectInputStream和ObjectOutputStream实现的。

  • ObjectOutputStream:用于将Java对象写入到输出流中,以便可以将其持久化到文件中或通过网络传输。
  • ObjectInputStream:用于从输入流中读取之前序列化的对象,实现对象的反序列化。

IO流是Java编程中处理文件和数据流的基础,掌握其使用方法对于开发高效、可靠的Java应用程序至关重要。

2. 字节流

2.1 字节流概述

字节流是Java IO流中用于处理二进制数据的流。它们通过字节(8位)作为数据传输的基本单位,能够处理任何类型的数据,包括文本和非文本文件。字节流的特点是操作灵活,可以读写任何类型的文件,但不支持字符编码和解码。

2.2 主要字节流类

Java中主要的字节流类包括InputStream和OutputStream,它们是所有字节输入流和输出流的基类。

  • InputStream:所有字节输入流的基类,提供了基本的读取方法,如read()和read(byte[] b)。
  • OutputStream:所有字节输出流的基类,提供了基本的写入方法,如write(int b)和write(byte[] b)。

2.3 文件字节流

Java提供了专门用于文件操作的字节流类FileInputStream和FileOutputStream。

  • FileInputStream:用于从文件中读取数据。它继承自InputStream,提供了从文件中读取字节的方法。
  • FileOutputStream:用于向文件写入数据。它继承自OutputStream,提供了向文件写入字节的方法。

2.4 缓冲字节流

缓冲字节流通过使用内部缓冲区来提高I/O操作的效率。Java提供了BufferedInputStream和BufferedOutputStream作为缓冲字节流的实现。

  • BufferedInputStream:对InputStream进行包装,提供了缓冲功能,可以减少实际的I/O操作次数,提高读取效率。
  • BufferedOutputStream:对OutputStream进行包装,提供了缓冲功能,可以减少实际的I/O操作次数,提高写入效率。

2.5 数据流

数据流类DataInputStream和DataOutputStream提供了读写Java基本数据类型的方法,它们继承自FilterInputStream和FilterOutputStream。

  • DataInputStream:可以从输入流中读取Java基本数据类型,如int、double等。
  • DataOutputStream:可以向输出流中写入Java基本数据类型。

2.6 内存操作流

内存操作流允许程序在内存中进行数据的读写操作,而不需要实际的文件系统。

  • ByteArrayInputStream和ByteArrayOutputStream:分别用于内存中的输入和输出操作,它们使用字节数组作为数据源。
  • PipedInputStream和PipedOutputStream:用于线程间的通信,一个线程可以从PipedInputStream读取数据,而另一个线程可以向PipedOutputStream写入数据。

2.7 随机访问流

RandomAccessFile类提供了对文件的随机访问能力,允许程序在文件中的任意位置进行读写操作。

  • RandomAccessFile:支持对文件的随机访问,可以指定文件的读写位置,适用于需要在文件中进行多次定位和操作的场景。

字节流是Java IO流中处理二进制数据的基础,通过这些流类,程序可以实现高效的文件读写操作,满足各种数据处理需求。

3. 字符流

3.1 字符流概述

字符流是Java IO流中用于处理文本数据的流。它们以字符为数据传输的基本单位,专门用于处理文本文件,并且支持字符编码和解码。

3.2 主要字符流类

Java中主要的字符流类包括Reader和Writer,它们是所有字符输入流和输出流的基类。

  • Reader:所有字符输入流的基类,提供了基本的读取方法,如read()和read(char[] cbuf)。
  • Writer:所有字符输出流的基类,提供了基本的写入方法,如write(int c)和write(char[] cbuf)。

3.3 文件字符流

Java提供了专门用于文件操作的字符流类FileReader和FileWriter。

  • FileReader:用于从文件中读取文本数据。它继承自Reader,提供了从文件中读取字符的方法。它支持指定字符集的解码,使得读取过程中可以正确处理不同编码的文本文件。
  • FileWriter:用于向文件写入文本数据。它继承自Writer,提供了向文件写入字符的方法。与FileReader类似,FileWriter也支持指定字符集的编码,以确保文本数据的正确写入。

3.4 缓冲字符流

缓冲字符流通过使用内部缓冲区来提高I/O操作的效率。Java提供了BufferedReader和BufferedWriter作为缓冲字符流的实现。

  • BufferedReader:对Reader进行包装,提供了缓冲功能,可以减少实际的I/O操作次数,提高读取效率。它还提供了方便的方法如readLine(),用于按行读取文本数据。
  • BufferedWriter:对Writer进行包装,提供了缓冲功能,可以减少实际的I/O操作次数,提高写入效率。它支持将文本数据写入到文件中,并允许指定字符集的编码。

3.5 行号读取流

LineNumberReader是Reader的子类,它在读取文本数据的同时,还能跟踪行号。

  • LineNumberReader:在进行文本读取时,可以获取当前读取的行号。这对于处理大型文本文件,需要跟踪行位置的应用程序非常有用。

3.6 打印流

打印流类PrintWriter和PrintStream提供了方便的打印功能,可以将各种数据类型直接输出到流中。

  • PrintWriter:可以向字符输出流打印各种数据类型的数据。它支持自动刷新缓冲区和跟踪行分隔符。
  • PrintStream:可以向字节输出流打印各种数据类型的数据。它通常用于打印到控制台或文件。

字符流是处理文本数据的重要工具,通过这些流类,程序可以方便地读取和写入文本文件,同时支持复杂的文本处理功能,如字符编码转换和行号跟踪。

4. 缓冲流

缓冲流在Java IO流中扮演着至关重要的角色,它们通过引入缓冲机制显著提高了数据的读写效率。以下是对缓冲流的详细讲解。

4.1 缓冲流的原理

缓冲流的工作原理是通过使用一个内部缓冲区来暂存数据,当缓冲区满时再进行实际的I/O操作。这种机制减少了对底层输入输出系统的直接调用次数,从而提高了性能。

4.2 缓冲字节流

Java提供了两个缓冲字节流类:BufferedInputStream和BufferedOutputStream。

  • BufferedInputStream:它包装一个InputStream对象,通过提供缓冲和一些帮助方法来提高效率。例如,它的read()方法可以一次性读取多个字节到内部缓冲区,然后逐步返回这些字节,减少了对底层输入流的读取次数。
  • BufferedOutputStream:它包装一个OutputStream对象,通过提供缓冲来提高效率。写入到BufferedOutputStream的数据首先被存储在内部缓冲区中,只有当缓冲区满了或者调用了flush()方法时,数据才会被真正写入到底层输出流。

4.3 缓冲字符流

同样地,Java也提供了两个缓冲字符流类:BufferedReader和BufferedWriter。

  • BufferedReader:它包装一个Reader对象,通过提供缓冲和一些帮助方法来提高效率。它的readLine()方法是一个非常有用的功能,它可以一次性读取整行数据,而不需要多次与底层输入流交互。
  • BufferedWriter:它包装一个Writer对象,通过提供缓冲来提高效率。写入到BufferedWriter的文本数据首先被存储在内部缓冲区中,只有当缓冲区满了或者调用了flush()方法时,数据才会被真正写入到底层输出流。

4.4 缓冲流的使用场景

缓冲流适用于那些需要频繁进行读写操作的场景,尤其是在处理大文件时,它们可以显著提高性能。例如,当程序需要从一个大文件中读取大量数据时,使用BufferedReader可以减少实际的文件读取次数,因为每次读取都会将整行数据读入内存中的缓冲区。

4.5 缓冲流的性能考量

尽管缓冲流可以提高性能,但它们也引入了额外的内存开销,因为需要为缓冲区分配内存空间。此外,缓冲流的效率也受到缓冲区大小的影响。默认情况下,缓冲流的缓冲区大小是8KB,但对于某些应用,可能需要调整这个大小以获得最佳性能。

4.6 缓冲流的注意事项

在使用缓冲流时,开发者应该注意以下几点:

  • 确保在数据完全写入后调用flush()方法,以确保所有缓冲中的数据都被写入到底层流中。
  • 在关闭流之前,应该先关闭缓冲流,然后再关闭底层流,以确保所有数据都被正确处理。
  • 对于非常小的数据量,缓冲流可能不会带来太大的性能提升,因为缓冲区的开销可能会抵消性能的提升。

通过以上分析,我们可以看到缓冲流在提高Java IO性能方面的重要性和实用性。正确使用缓冲流可以显著提高数据处理应用的性能,尤其是在处理大量数据时。

5. 转换流

5.1 转换流的基本概念

转换流在Java IO流中扮演着桥梁的角色,它们允许程序在字节流和字符流之间进行转换。这种转换在处理不同编码的文本数据时尤为重要,因为字节流本身不支持字符编码和解码。

5.2 转换流的主要类

Java提供了两个主要的转换流类:InputStreamReader和OutputStreamWriter。

  • InputStreamReader:这是一个桥梁类,它将字节流转换为字符流。它根据指定的字符集将字节解码转换为字符。如果没有指定字符集,则使用系统的默认字符集。
  • OutputStreamWriter:这是另一个桥梁类,它将字符流转换为字节流。它根据指定的字符集将字符编码转换为字节。与InputStreamReader类似,如果没有指定字符集,则使用系统的默认字符集。

5.3 InputStreamReader的使用

InputStreamReader通常与字节流如FileInputStream一起使用,用于读取字符编码的文件。例如,当需要读取一个UTF-8编码的文本文件时,可以这样使用InputStreamReader:

FileInputStream fis = new FileInputStream("example.txt");
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
    System.out.println(line);
}
br.close();

在这个例子中,InputStreamReader将FileInputStream读取的字节转换为字符,并且使用UTF-8编码进行解码。然后,BufferedReader用于高效地按行读取文本数据。

5.4 OutputStreamWriter的使用

OutputStreamWriter通常与字节流如FileOutputStream一起使用,用于写入字符编码的文件。例如,当需要写入一个UTF-8编码的文本文件时,可以这样使用OutputStreamWriter:

FileOutputStream fos = new FileOutputStream("example.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write("Hello, World!");
bw.newLine();
bw.write("This is another line.");
bw.close();

在这个例子中,OutputStreamWriter将写入的字符转换为字节,并且使用UTF-8编码进行编码。然后,BufferedWriter用于高效地写入文本数据。

5.5 转换流的性能考量

转换流的性能受到字符集转换效率的影响。在处理大量数据时,字符集的转换可能会成为性能瓶颈。因此,选择高效的字符集和合理的缓冲区大小对于提高性能至关重要。

5.6 转换流的注意事项

在使用转换流时,开发者应该注意以下几点:

  • 确保在创建InputStreamReader和OutputStreamWriter时指定正确的字符集,以避免字符编码和解码错误。
  • 在关闭流之前,应该先关闭转换流,然后再关闭底层的字节流,以确保所有数据都被正确处理。
  • 对于需要频繁进行读写操作的场景,使用缓冲流(如BufferedReader和BufferedWriter)包装转换流可以提高性能。

6. 文件专属流

6.1 文件专属流的概述

文件专属流是Java IO流中的一个特殊类别,它们提供了对文件的直接操作能力,包括文件的创建、删除、移动和属性管理等。这些流类主要是File类及其相关的流类,如FileInputStream、FileOutputStream、FileReader和FileWriter。

6.2 主要文件专属流类

Java中主要的文件专属流类包括:

  • FileInputStream:用于从文件中读取数据。它继承自InputStream,提供了从文件中读取字节的方法。
  • FileOutputStream:用于向文件写入数据。它继承自OutputStream,提供了向文件写入字节的方法。
  • FileReader:用于从文件中读取文本数据。它继承自Reader,提供了从文件中读取字符的方法。
  • FileWriter:用于向文件写入文本数据。它继承自Writer,提供了向文件写入字符的方法。

6.3 FileInputStream的使用

FileInputStream通常用于读取二进制文件,如图片、音频和视频文件。它提供了直接从文件中读取字节流的能力。例如,以下代码展示了如何使用FileInputStream来读取一个文件:

FileInputStream fis = new FileInputStream("example.bin");
int byteRead;
while ((byteRead = fis.read()) != -1) {
    // 处理读取的字节
}
fis.close();

在这个例子中,FileInputStream用于从文件中逐个字节地读取数据,直到到达文件末尾。

6.4 FileOutputStream的使用

FileOutputStream用于写入二进制文件。它可以创建新文件或覆盖现有文件。以下代码展示了如何使用FileOutputStream来写入一个文件:

FileOutputStream fos = new FileOutputStream("example.bin");
fos.write(new byte[] {0x01, 0x02, 0x03});
fos.close();

在这个例子中,FileOutputStream用于向文件中写入一个字节数组。

6.5 FileReader的使用

FileReader是专门用于读取文本文件的流类。它支持指定字符集的解码,使得读取过程中可以正确处理不同编码的文本文件。以下代码展示了如何使用FileReader来读取一个文本文件:

FileReader fr = new FileReader("example.txt");
int charRead;
while ((charRead = fr.read()) != -1) {
    // 处理读取的字符
}
fr.close();

在这个例子中,FileReader用于从文件中逐个字符地读取数据,直到到达文件末尾。

6.6 FileWriter的使用

FileWriter是专门用于写入文本文件的流类。它支持指定字符集的编码,以确保文本数据的正确写入。以下代码展示了如何使用FileWriter来写入一个文本文件:

FileWriter fw = new FileWriter("example.txt");
fw.write("Hello, World!");
fw.close();

在这个例子中,FileWriter用于向文件中写入字符串。

6.7 文件专属流的性能考量

文件专属流的性能受到文件系统性能的影响。在处理大文件时,使用缓冲流(如BufferedInputStream和BufferedOutputStream)可以显著提高性能,因为它们减少了实际的文件系统调用次数。

6.8 文件专属流的注意事项

在使用文件专属流时,开发者应该注意以下几点:

  • 确保在操作完成后关闭流,以释放系统资源。可以使用try-with-resources语句来自动管理资源。
  • 在写入文件时,如果文件已存在,FileOutputStream和FileWriter会覆盖现有文件,除非使用FileWriter的追加模式。
  • 对于需要频繁进行读写操作的场景,使用缓冲流可以提高性能。
  • 在处理文件时,应该处理好异常和错误,例如使用catch块捕获IOException。

7. 特殊功能流

7.1 特殊功能流的概述

特殊功能流在Java IO流中提供了一些额外的功能,以满足特定的数据处理需求。这些流类扩展了基本的输入输出功能,使得开发者可以更加方便地处理复杂的数据流。

7.2 数据流

数据流类DataInputStream和DataOutputStream提供了读写Java基本数据类型的方法,它们继承自FilterInputStream和FilterOutputStream。

  • DataInputStream:可以从输入流中高效地读取Java基本数据类型,如int、double等。它使用特定的方法来读取数据,而不是依赖于字节或字符的直接解释,这使得它在处理二进制数据时更加可靠和高效。
  • DataOutputStream:可以向输出流中写入Java基本数据类型。与DataInputStream相对应,它确保数据以一种可预测和一致的方式被写入,便于后续的读取和处理。

7.3 对象流

对象流类ObjectInputStream和ObjectOutputStream提供了对象的序列化和反序列化功能。

  • ObjectOutputStream:用于将Java对象的的状态写入输出流中,以便可以将其持久化到文件中或通过网络传输。它通过实现Serializable接口来标记可以被序列化的对象。
  • ObjectInputStream:用于从输入流中读取之前序列化的对象,实现对象的反序列化。它在读取对象时会进行类型检查,确保读取的对象与预期的类型一致。

7.4 随机访问流

RandomAccessFile类提供了对文件的随机访问能力,允许程序在文件中的任意位置进行读写操作。

  • RandomAccessFile:支持对文件的随机访问,可以指定文件的读写位置。这在需要频繁在文件中不同位置进行读写的场景中非常有用,例如在处理大型日志文件或数据文件时。

7.5 管道流

管道流类PipedInputStream和PipedOutputStream用于线程间的通信。

  • PipedInputStream:可以从中读取数据,数据由另一个线程写入到关联的PipedOutputStream。
  • PipedOutputStream:可以向其写入数据,数据将被读取从关联的PipedInputStream。这种流主要用于线程间的通信,允许一个线程的生产者-消费者模型。

7.6 内存操作流

内存操作流类ByteArrayInputStream和ByteArrayOutputStream允许程序在内存中进行数据的读写操作,而不需要实际的文件系统。

  • ByteArrayInputStream:从内存中的字节数组中读取数据,这在处理来自不同源的字节数据时非常有用,例如从网络接收的数据。
  • ByteArrayOutputStream:向内存中的字节数组写入数据,可以随后从数组中获取数据或将其写入到文件中。这对于临时存储数据或构建动态生成的数据流非常有用。

特殊功能流通过提供这些额外的功能,使得Java IO流更加强大和灵活,能够满足各种复杂的数据处理需求。开发者可以根据具体的应用场景选择合适的特殊功能流来提高程序的性能和可维护性。

8. 对象序列化与反序列化

8.1 序列化的概念

对象序列化是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,序列化是指将对象转换成一个字节流,以便可以将其持久化到磁盘或通过网络发送到其他JVM实例。

8.2 序列化的实现

要使一个Java对象可以被序列化,它的类必须实现java.io.Serializable接口。这个接口是一个标记性接口,不包含方法,其主要目的是标识这个类的对象可以被序列化。

8.3 ObjectOutputStream类

ObjectOutputStream类是序列化的实现者,它扩展了OutputStream,提供了将对象状态写入流中的方法。以下是一个简单的序列化示例:

import java.io.*;

public class SerializationExample {
    public static void main(String[] args) {
        try {
            FileOutputStream file = new FileOutputStream("object.data");
            ObjectOutputStream out = new ObjectOutputStream(file);
            out.writeObject(new Integer(123));
            out.close();
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}

在这个示例中,一个Integer对象被写入到文件"object.data"中。

8.4 反序列化的概念

反序列化是序列化的逆过程,它将字节流转换回对象。ObjectInputStream类是反序列化的实现者,它扩展了InputStream,提供了从流中读取对象状态的方法。

8.5 ObjectInputStream类

以下是一个简单的反序列化示例:

import java.io.*;

public class DeserializationExample {
    public static void main(String[] args) {
        try {
            FileInputStream file = new FileInputStream("object.data");
            ObjectInputStream in = new ObjectInputStream(file);
            Integer number = (Integer) in.readObject();
            System.out.println("Deserialized Integer: " + number);
            in.close();
        } catch (IOException i) {
            i.printStackTrace();
        } catch (ClassNotFoundException c) {
            System.out.println("Integer class not found");
            c.printStackTrace();
        }
    }
}

在这个示例中,之前序列化的Integer对象被从文件"object.data"中读取并反序列化。

8.6 序列化与反序列化的注意事项

  • 只有实现了Serializable接口的类的对象才能被序列化。
  • 序列化过程中,对象的静态变量不会被序列化,因为它们属于类而不是对象的实例。
  • 序列化和反序列化过程可能会抛出IOException,因此在操作过程中需要进行异常处理。
  • 反序列化时,需要处理ClassNotFoundException,这可能在找不到对象类的定义时抛出。
  • 序列化并不关心对象是如何被创建的,它只关注对象的状态信息。
  • 序列化过程中,如果对象包含对其他对象的引用,那么被引用的对象也会被序列化,这可能会导致内存中的不必要增长。

9. File类

9.1 File类的基本概念

File类是Java IO流中用于表示文件和目录路径的抽象表示形式。它封装了文件或目录的路径名,提供了操作文件或目录的方法,如创建、删除、重命名、获取属性等。

9.2 File类的主要方法

File类提供了多种方法来操作文件和目录,以下是一些常用的方法:

  • 创建文件和目录:createNewFile()方法用于创建一个新的空文件,如果文件已存在,则不创建并返回false。
  • 删除文件和目录:delete()方法用于删除文件或目录,如果目录不为空,则不能被删除。
  • 重命名文件或目录:renameTo(File dest)方法用于将文件或目录重命名或移动到新的路径。
  • 获取文件长度:length()方法返回文件的长度,即文件中的字节数。
  • 检查文件是否存在:exists()方法检查文件或目录是否存在,返回布尔值。
  • 获取绝对路径:getAbsolutePath()方法返回文件或目录的绝对路径。
  • 获取文件名:getName()方法返回文件或目录的名称。
  • 获取父目录:getParent()方法返回文件或目录的父目录的路径。
  • 列出文件和目录:list(FilenameFilter filter)方法返回一个字符串数组,表示目录中的文件名,可以使用过滤器来筛选特定类型的文件。

9.3 File类使用示例

以下是使用File类来操作文件和目录的一些示例代码:

import java.io.File;

public class FileExample {
    public static void main(String[] args) {
        File file = new File("example.txt");
        
        // 创建文件
        try {
            if (!file.exists()) {
                boolean isCreated = file.createNewFile();
                if (isCreated) {
                    System.out.println("File is created!");
                } else {
                    System.out.println("File already exists.");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // 删除文件
        boolean isDeleted = file.delete();
        if (isDeleted) {
            System.out.println("File is deleted!");
        } else {
            System.out.println("File deletion failed.");
        }
        
        // 获取文件信息
        System.out.println("File name: " + file.getName());
        System.out.println("File path: " + file.getAbsolutePath());
        System.out.println("File length: " + file.length() + " bytes");
    }
}

在这个示例中,我们创建了一个名为"example.txt"的文件,然后检查文件是否存在,如果不存在则创建它。之后,我们删除了这个文件,并打印了文件的一些基本信息。

9.4 File类的注意事项

在使用File类时,需要注意以下几点:

  • File类是与平台无关的,这意味着在不同操作系统中路径分隔符可能会有所不同,例如Windows中通常使用反斜杠\,而在Unix/Linux中使用正斜杠/。
  • 当使用File类的list()方法来列出目录中的文件时,如果目录不存在或目录不可读,将抛出SecurityException。
  • File类的方法通常不会抛出检查异常,而是抛出非检查异常,如IOException,因此在操作文件时需要进行异常处理。
  • 在处理文件和目录时,应该考虑到安全性,避免路径遍历攻击等安全问题。

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

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

相关文章

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数

文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座,并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站,可见性分析确定地面站坐标分析单颗…

Excel菜单选项无法点击?两种原因及解决方法全解析

在使用Excel处理数据时,有时会遇到菜单选项无法点击的情况。这种问题会影响到正常的操作和编辑。出现这种情况的原因可能有多种,本文将介绍两种常见的原因,并提供相应的解决方法,帮助小伙伴们快速恢复菜单选项的正常使用。 原因一…

【银河麒麟高级服务器操作系统·实例分享】裸金属服务器开机失败分析及处理建议

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer.kylinos.cn 文档中心:https://documentkylinos.cn 现象描述 裸金属物理服务器开机卡在EFI stub页面…

基于Spring Boot的在线摄影工作室开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理网上摄影工作室的相关信息成为必然。开发合…

UE5蓝图中整理节点的方法

UE5蓝图中整理节点的方法 第一种:子图 右键选中的节点,出现一个面板,点击 Collapse Nodes 既可折叠选中的所有节点 注意:子图不可以被复制使用。 双击子图可以查看节点,若不想折叠选中的节点为子图,右键点…

喜讯丨江苏省医药行业协会·中药饮片专业委员会2024年度三届五次会员代表大会暨《江苏中药饮片》通讯员年度表彰大会圆满举行

2024年10月25日,江苏省医药行业协会中药饮片专业委员会三届五次(2024年度)会员代表大会暨《江苏中药饮片》通讯员年度表彰大会在苏州香格里拉大酒店隆重召开。 江苏省药品监督管理局、药品生产监管局、江苏省医药行业协会、江苏省食品药品监督…

git push到远程怎么回退

git push到远程服务器想继续修改,你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令,回退很简单。 按照下面的流程操作就行: 1.查看提交历史 首先,使用git log命令查看提交历史。可以使用以下命令显…

回溯法 | 无限个for循环?

文章目录 起因实现 优化 起因 回溯算法,寻找问题的所有解或最优解 最开始遇到这样一个问题,认为可以用几个for循环暴力解决,然而仔细观察后发现,针对不同的输入,我需要的for循环的个数不一样,只能使用递归…

react18中react-thunk实现公共数据仓库的异步操作

redux及react-redux都只能实现数据的同步修改更新,有点类似于vue中的mutation,只能做同步操作,异步的话不用actions来实现。由于在项目始终不可避免要实现的异步数据的更新,这明显不够用了。是时候引入我们的异步中间件redux-thun…

原生js实现拖拽上传(拖拽时高亮上传区域)

文章目录 drop相关事件说明-MDN演示代码&#xff08;.html) drop相关事件说明-MDN 演示 代码&#xff08;.html) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…

最新XL换脸术!EcomID,更像更强,结合InstantID和PuLID优点,200万训练集,6.6显存占用,ComfyUI

由阿里妈妈最新开源的换脸工具&#xff1a;EcomID&#xff0c;结合了InstantID和PuLID优点&#xff0c;以获得更好的背景一致性、面部关键点控制、更真实的面部以及更高的相似度。旨在从单个ID参考图像生成定制的保ID图像&#xff0c;优势在于很强的语义一致性&#xff0c;同时…

情感咨询小程序的市场需求大吗?

情感咨询小程序的市场需求较大&#xff0c;主要体现在以下几个方面&#xff1a; 情感问题普遍存在5&#xff1a; 恋爱关系困扰&#xff1a;在恋爱过程中&#xff0c;人们经常会遇到诸如沟通不畅、争吵频繁、信任危机等问题。例如&#xff0c;年轻人在恋爱初期可能会因为不了解…

技术分享 | 大语言模型增强灰盒模糊测试技术探索

大语言模型凭借其庞大的参数规模&#xff0c;能够通过无监督学习从海量文本中获取知识&#xff0c;从而不仅能够深刻理解文本语义&#xff0c;还能准确识别文本的格式和结构。凭借对不同数据结构的深度理解&#xff0c;大语言模型已在众多领域得到广泛应用。其中&#xff0c;尤…

Cmake Error:could not find any instance of Visual Studio.

出现以下错误 解决方案&#xff1a; 安装visual stuido 2017。 检查是否安装“使用C的桌面开发” 检查是否安装了扩展开发 点开“单个组件”是否安装了以下组件 编辑计算机环境变量&#xff0c;

linux查看文件命令

查看文件命令 显示命令 cat 语法&#xff1a;cat 【选项】 文件 选项 命令含义n显示行号包括空行b显示行号不包括空行s压缩空行为一行A显示隐藏字符 cat -n 文件&#xff1a;显示行号包括空行 cat -b 文件 cat -s 文件 cat -A 文件 more和less是 分页查看 tac和rev都…

使用Python统计目录下所有.txt文件中的字符数

前言 在日常开发或数据处理中&#xff0c;我们经常需要对大量文本文件进行各种统计操作&#xff0c;比如计算总字数。本文将介绍一种简单的方法&#xff0c;通过Python脚本遍历指定目录下的所有.txt文件&#xff0c;并统计这些文件中的字符总数。这个过程可以帮助开发者更好地…

【Kaggle | Pandas】练习2:索引,选择和分配

文章目录 数据总表1、读取列2、读取某列的第几行的值3、第一行数据4、读取列中前10个值5、读取索引标签为1 、 2 、 3 、 5和8的记录6、包含索引标签为0 、1 、10和100的记录的country 、province 、 region_1和region_2列7、 前 100 条记录的country和variety列8、包含Italy葡…

三款计算服务器配置→如何选择科学计算服务器?

科学计算在众多领域都扮演着关键角色&#xff0c;无论是基础科学研究还是实际工程应用&#xff0c;强大的计算能力都是不可或缺的。而选择一台合适的科学计算服务器&#xff0c;对于确保科研和工作的顺利进行至关重要。 首先&#xff0c;明确自身需求是重中之重。要仔细考虑计算…

【ceral】c++轻量的序列化库

背景 在开发硬件产品时&#xff0c;会有一些参数配置文件&#xff0c;为了保密性或者传输&#xff0c;需要对其序列化处理&#xff0c;待到产品读取文件时&#xff0c;进行反序列化解码转化为设定的参数类型。 简介 ceral是一个仅包含头文件的C序列化库&#xff0c;可以将任…