Java基础 —— IO流详解

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.mzph.cn/pingmian/58117.shtml

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

相关文章

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答(代码规范与生态管理)

软硬件开发,对于编码规范、生态管理等等综合问题的考察尤为重要。 阐述下环形缓冲区的用途 环形缓冲区(Ring Buffer)是一种固定大小的数据结构,常用于实现数据的流式传输或临时存储。在环形缓冲区中,当到达缓冲区的末尾…

计算机网络:数据链路层 —— 虚拟局域网 VLAN

文章目录 局域网虚拟局域网 VLAN虚拟局域网 VLAN 概述实现机制IEEE 802.1Q帧以太网交换机的接口类型Access 接口Trunk 接口Hybrid 接口不进行人为的VLAN划分划分两个不同VLANTrunk接口去标签后进行转发Trunk接口直接转发 局域网 局域网(Local Area Network&#xf…

【Vulnhub靶场】DC-6

DC-6靶场下载地址:https://download.vulnhub.com/dc/DC-6.zip​​​​​​ 目标 本机IP:192.168.118.128 靶机IP:192.168.118.0/24 信息收集 主机发现 arp-scan 192.168.118.0/24 根据上图得出目标主机为192.168.118.143 扫描端口&#x…

深入理解Java基础概念的高级应用(1/5)

目录 1. Java内存模型:堆、栈与方法区 示例代码:对象存储位置 2. 类加载器的工作原理 示例代码:自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码:基础类型…

Python小游戏14——雷霆战机

首先,你需要确保安装了Pygame库。如果你还没有安装,可以使用pip来安装: bash pip install pygame 代码如下: python import pygame import sys import random # 初始化Pygame pygame.init() # 设置屏幕大小 screen_width 800 scr…

Android在kts中使用navigation及Args

Android在kts中使用navigation及Args 前言: ​ 之前在项目中使用过navigation,但都是以Groory的方式,最近一年多使用kts后忍不住把项目都改成kts的方式,不过其中也遇到不少坑,今天就讲解一下如何在kts中使用navigati…

解决蓝牙键盘按键错乱的问题

最近发现我的蓝牙键盘按下的键盘与实际不符,于是就上网搜索答案,网上的方法都试了一遍 最后想着准备退货,没想到客服直接给我解决了 原因很简单,就是之前误触了键盘的某些按键导致的 每个键盘品牌的按键因该都不同的,可…

VBA技术资料MF220:删除模块内容

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

英伟达GPU算力【自用】

GPU(图形处理单元)算力的提升是驱动当代科技革命的核心力量之一,尤其在人工智能、深度学习、科学计算和超级计算机领域展现出了前所未有的影响力。2024年的GPU技术发展,不仅体现在游戏和图形处理的传统优势上,更在跨行…

ZooKeeper 客户端API操作

文章目录 一、节点信息1、创建节点2、获取子节点并监听节点变化3、判断节点是否存在4、客户端向服务端写入数据写入请求直接发给 Leader 节点写入请求直接发给 follow 节点 二、服务器动态上下线监听1、监听过程2、代码 三、分布式锁1、什么是分布式锁?2、Curator 框架实现分布…

qt 滚动条 美化

qt QScrollBar 滚动条分为竖直与水平滚动条,两者设置上类似,但也有一些不同,下面主要讲述美化及注意事项。 一、竖直滚动条 竖直滚动条分为7个部分: sub-line、 up-arrow 、sub-page、 hanle、 add-line、 dow-arrow、 add-pag…

线性回归模型与检验 6个适用条件

当因变量与自变量间存在线性相关关系时,可以使用线性回归分析方法确定它们之间的相互依赖的定量关系。此处所说的定量关系,并非严格的因果关系,而是自变量X对因变量Y的影响或预测的作用。 例如分析广告费、产品单价、产品满意度、服务满意度…

说它是谁就是谁—Python语言中的鸭子类型

鸭子类型(Duck Typing)是动态类型语言中的一种类型推断风格,尤其在Python语言中得到了广泛的应用。它的核心思想是:“如果它走起路来像鸭子,叫起来像鸭子,那么它就是鸭子”。这句话的意思是,我们…

python_httpstat库

Python httpstat是一个基于Python的命令行工具,用于测量HTTP请求的性能和状态信息。它能够向目标服务器发送HTTP请求,并显示详细的统计信息,包括DNS解析时间、建立连接时间、TLS/SSL握手时间、首字节时间、总时间等。这些信息对于排查网络问题…

详解varint,zigzag编码, 以及在Go标准库中的实现

文章目录 为啥需要varint编码为啥需要zigzag编码varint编码解码 zigzag编码解码 局限性 为啥需要varint编码 当我们用定长数字类型int32来表示整数时,为了传输一个整数1,我们需要传输00000000 00000000 00000000 00000001 32 个 bits,而有价…

SQLite3库增删改查实现数据管理

1. SQLite3简介 SQLite3是一个轻量级的、嵌入式的关系型数据库管理系统,在保存测序数据或结果等时可使用,简单高效,并且有无需服务器、单文件存储数据、支持标准SQL、支持跨平台等优势。 本文以Sqlite3数据库为基础,创建代码示例…

tomcat基本配置

目录 1.java容器简介介绍 2.部署tomcat 2.1上传jdk 2.2创建一个软连接 2.3配置环境变量 2.4读取环境文件并且查看java版本 2.5检查jdk tomcat信息 2.6启动tomcat 2.7检测 3.tomcat 目录结构 3.1总体目录 3.2 bin目录 3.3conf 3.4 logs日志 4.运行代码 4.…

如何确保电子商务网站服务器的正常运行时间

对于电商网站而言,服务器的正常运行时间至关重要。网站宕机会直接影响销售额、客户体验以及品牌声誉。本文将详细探讨如何监控并保障服务器的正常运行时间,确保您的电商网站始终保持在线状态, 为什么监控正常运行时间很重要? 减…

【Oracle实验】字段为空的,无法通过排除判断

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.场景描述 需求:查询不是某个机构的数据。 同事SQL:where substr(bank_code,1,9) not in(014009001); 看SQL似乎没什么问题,分析…

【modbus协议】libmodbus库移植基于linux平台

文章目录 下载库函数源码编译路径添加libmodbus 源码分析核心数据结构常用接口函数 开发 TCP Server 端开发TCP Client 端 下载库函数源码 编译路径添加 libmodbus 源码分析 核心数据结构 modbus_t结构体: 这是 libmodbus 的核心数据结构,代表一个 Mod…