Java程序设计实验7 | IO流

*本文是博主对Java各种实验的再整理与详解,除了代码部分和解析部分,一些题目还增加了拓展部分(⭐)。拓展部分不是实验报告中原有的内容,而是博主本人自己的补充,以方便大家额外学习、参考。

目录

一、实验目的

二、实验内容

1、判断E盘指定目录下是否有后缀名为.jpg的文件,如果有就输出此文件名称。

 2、分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作并比较两种方式在复制时间上的效率。

3、编写一个程序,分别使用转换流、字符流和缓冲字符流拷贝一个文本文件。

4、编程序实现下列功能

5、复制指定目录中的指定类型(如.java)的文件到另一个目录中。

6、已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”,请编写程序读取数据内容,把数据排序后写入ss.txt中。

三、实验总结


一、实验目的

1、理解字节流和字符流的含义,掌握IO流的分类;

2、掌握File类的使用;

3、掌握文件字节流FileInputStream、FileOutputStream和文件字符流FileReader、FileWriter的使用;

4、掌握字符缓冲流BufferedReader、BufferedWriter的使用;

5、了解转换流OutputStreamWriter和InputStreamReader的使用;

6、能够灵活使用IO流完成数据的处理。


二、实验内容

1、判断E盘指定目录下是否有后缀名为.jpg的文件,如果有就输出此文件名称。

由于博主电脑没设E盘,因此路径改为D盘。路径下内容为:

通过Java的文件操作来实现。File类是 Java 中抽象表示文件和目录路径名的一个类,它提供了一系列方法,可以用于创建、删除、重命名等文件和目录的基本操作,以及获取文件信息。在实现该练习时,用到了如下几个方法:

  1. File directory = new File(directoryPath)    这是根据目录路径创建File对象,目录路径是我们事先指定的目标路径,指定的路径是哪个,后续就对哪个路径进行操作。可以把File对象理解成我们要进行文件操作的遥控器。操作系统是对文件系统的直接管理,而我们用户要操作文件,是通过创建File对象、调用File对象中的各种方法实现的。(这个形式和socket操作网卡,thread操作线程类似。)
  2. File[] files = directory.listFiles()    获取目录下的所有文件,用File数组来接收。在博主本人的程序中,获取到的就是test.jpg和fox.png这两个文件。获取目录下所有文件的操作往往和遍历数组配合使用,以搭配条件语句对目录下的文件进行过滤,如:
    File[] files = directory.listFiles(); // 获取目录下的文件和子目录列表
    for (File file : files) {// 处理每个文件或目录
    }
    
  3. file.isFile()    用于判断file对象是否是一个文件。
  4. file.getName().toLowerCase().endsWith(".jpg")    用于判断file对象名是否以“.jpg”结尾。getName()获取到file对象的文件名(是一个字符串),后面的toLowerCase().endsWith(".jpg")是字符串String的方法。

源代码:

import java.io.File;public class S7_1 {public static void main(String[] args) {// 指定目录路径String directoryPath = "D:\\ASSIGNMENT\\code\\javacode\\leetcode-test\\imgdir";// 创建File对象File directory = new File(directoryPath);// 获取目录下所有文件File[] files = directory.listFiles();// 遍历文件列表if (files != null) {for (File file : files) {// 判断文件是否以.jpg结尾if (file.isFile() && file.getName().toLowerCase().endsWith(".jpg")) {// 输出文件名称System.out.println(file.getName());}}} else {System.out.println("指定目录不存在或不是一个目录!");}}
}

列出测试数据和实验结果截图:

 2、分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作并比较两种方式在复制时间上的效率。

字节流和字节缓冲流是 Java 中用于处理二进制数据的输入输出流类,用于进行字节级别的数据读写操作。

1、字节流

  • 字节流以字节为单位进行数据传输,适用于处理二进制数据,如图片、音频、视频等文件。
  • InputStreamOutputStream 是 Java 中用于操作字节流的抽象基类。
  • 常见的字节流类包括 FileInputStreamFileOutputStreamByteArrayInputStreamByteArrayOutputStream 等。

2、字节缓冲流

  • 字节缓冲流是对字节流的一种包装,在读写过程中加入了缓冲区,以提高读写效率。
  • 通过使用缓冲区,可以减少实际读写硬盘的次数,从而提高了数据传输的效率。
  • 常见的字节缓冲流类包括 BufferedInputStreamBufferedOutputStream

理解一下“缓冲区”:可以想象有一个工人正在开卡车搬运箱子,他的任务是把箱子从A厂转移到B厂。箱子有很多,如果此时他一个一个搬运,每在A厂将一个箱子放上卡车就开车运到B厂,这样的效率是非常低的且有很多不必要的开销;而如果他先在A厂把所有要搬的箱子都放到一辆卡车上,等要搬运的箱子都放上卡车后一趟直接开到B厂,那么这样他只需要跑一趟就能一块搬运完所有的箱子,这样是效率更高也更节约资源的。

使用字节缓冲流相比直接使用字节流,可以提高读写效率(特别是在处理大文件时)。因为字节缓冲流会将数据先写入内存缓冲区,待缓冲区满或达到一定条件时再一次性写入文件,减少了频繁的硬盘读写操作。

如果需要处理二进制数据且关注性能和效率,通常会选择使用字节缓冲流来进行文件读写操作。

其他细节处理如下:

  1. 如何比较时间效率?经典的方法是分别记录下程序执行前的时间戳和程序执行完毕后的时间戳,二者的时间间隔即程序运行的时间。常用代码如下:
    long startTime1 = System.currentTimeMillis();
    // do something...
    long endTime1 = System.currentTimeMillis();
    long timeByByteStream = endTime1 - startTime1;
  2. 分别定义方法copyFileByByteStream(字节流复制文件)和copyFileByBufferedStream(字节缓冲流)复制文件。两个方法的逻辑相同,即分别创建输入对象in和输出对象out,通过调用in的read方法读取source.jpg到一个变量,再通过out的write方法将该变量中的内容写入输出目录。
  3. 在try中申请资源,这样在在try块结束时会自动关闭这些资源,以确保资源被正确释放,避免资源泄露。
  4. source.jpg存放的位置:必须在工程项目Project目录下时,创建文件对象才能直接使用文件名(也即相对路径),否则必须使用绝对路径。如:

源代码:

import java.io.*;public class S7_2 {public static void main(String[] args) {String sourceFilePath = "source.jpg"; // 源文件路径String destFilePath1 = "dest1.jpg";   // 目标文件路径(字节流复制)String destFilePath2 = "dest2.jpg";   // 目标文件路径(字节缓冲流复制)// 使用字节流复制图片文件并计时long startTime1 = System.currentTimeMillis();copyFileByByteStream(sourceFilePath, destFilePath1);long endTime1 = System.currentTimeMillis();long timeByByteStream = endTime1 - startTime1;// 使用字节缓冲流复制图片文件并计时long startTime2 = System.currentTimeMillis();copyFileByBufferedStream(sourceFilePath, destFilePath2);long endTime2 = System.currentTimeMillis();long timeByBufferedStream = endTime2 - startTime2;// 输出复制时间System.out.println("使用字节流复制图片文件耗时:" + timeByByteStream + " 毫秒");System.out.println("使用字节缓冲流复制图片文件耗时:" + timeByBufferedStream + " 毫秒");}// 使用字节流复制文件的方法private static void copyFileByByteStream(String sourcePath, String destPath) {try (InputStream in = new FileInputStream(sourcePath);OutputStream out = new FileOutputStream(destPath)) {int byteRead;while ((byteRead = in.read()) != -1) {out.write(byteRead);}} catch (IOException e) {e.printStackTrace();}}// 使用字节缓冲流复制文件的方法private static void copyFileByBufferedStream(String sourcePath, String destPath) {try (InputStream in = new BufferedInputStream(new FileInputStream(sourcePath));OutputStream out = new BufferedOutputStream(new FileOutputStream(destPath))) {byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();}}
}

列出测试数据和实验结果截图: 

3、编写一个程序,分别使用转换流、字符流和缓冲字符流拷贝一个文本文件。

要求:

• 分别使用InputStreamReader、OutputStreamWriter类和FileReader、FileWriter类用两种方式(字符和字符数组)进行拷贝。

• 使用BufferedReader、BufferedWriter类的特殊方法进行拷贝。

源代码:

import java.io.*;public class S7_3 {public static void main(String[] args) {String sourceFilePath = "source.txt";String destFilePath = "destination.txt";// 使用转换流拷贝文件(字符方式)copyFileWithInputStreamReader(sourceFilePath, destFilePath);// 使用转换流拷贝文件(字符数组方式)copyFileWithInputStreamReaderAndCharArray(sourceFilePath, destFilePath);// 使用字符流拷贝文件copyFileWithFileReader(sourceFilePath, destFilePath);// 使用字符流拷贝文件(字符数组方式)copyFileWithFileReaderAndCharArray(sourceFilePath, destFilePath);// 使用缓冲字符流拷贝文件copyFileWithBufferedReader(sourceFilePath, destFilePath);}// 使用转换流拷贝文件(字符方式)private static void copyFileWithInputStreamReader(String sourceFilePath, String destFilePath) {try (InputStreamReader reader = new InputStreamReader(new FileInputStream(sourceFilePath));OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(destFilePath))) {int data;while ((data = reader.read()) != -1) {writer.write(data);}} catch (IOException e) {e.printStackTrace();}}// 使用转换流拷贝文件(字符数组方式)private static void copyFileWithInputStreamReaderAndCharArray(String sourceFilePath, String destFilePath) {try (InputStreamReader reader = new InputStreamReader(new FileInputStream(sourceFilePath));OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(destFilePath))) {char[] buffer = new char[1024];int length;while ((length = reader.read(buffer)) != -1) {writer.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}// 使用字符流拷贝文件private static void copyFileWithFileReader(String sourceFilePath, String destFilePath) {try (FileReader reader = new FileReader(sourceFilePath);FileWriter writer = new FileWriter(destFilePath)) {int data;while ((data = reader.read()) != -1) {writer.write(data);}} catch (IOException e) {e.printStackTrace();}}// 使用字符流拷贝文件(字符数组方式)private static void copyFileWithFileReaderAndCharArray(String sourceFilePath, String destFilePath) {try (FileReader reader = new FileReader(sourceFilePath);FileWriter writer = new FileWriter(destFilePath)) {char[] buffer = new char[1024];int length;while ((length = reader.read(buffer)) != -1) {writer.write(buffer, 0, length);}} catch (IOException e) {e.printStackTrace();}}// 使用缓冲字符流拷贝文件private static void copyFileWithBufferedReader(String sourceFilePath, String destFilePath) {try (BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath));BufferedWriter writer = new BufferedWriter(new FileWriter(destFilePath))) {String line;while ((line = reader.readLine()) != null) {writer.write(line);writer.newLine();}} catch (IOException e) {e.printStackTrace();}}
}

 列出测试数据和实验结果截图: 

生成的目标文件:

建议:同学们在完成该程序时,让每种方法保存的文件名都不相同。我这里因为所有的目标文件名都指定成了destination.txt,所以存在覆盖保存的情况,最终就只有一个目标文件了。

4、编程序实现下列功能

• 向指定的txt文件中写入键盘输入的内容,然后再重新读取该文件的内容,显示到控制台上。

• 键盘录入5个学生信息(姓名, 成绩),按照成绩从高到低追加存入上述的文本文件中。

首先进行准备工作,在Project目录下创建两个txt文件备用:

确保这两个文件是空的,然后编写代码。几个关键步骤说明:

  1. 为了让代码更加规范,建议将文件名定义成只读常量,以static final修饰。
  2. 定义writeToFile()和readFromFile()方法,分别用于向指定的txt文件中写入键盘输入的内容以及重新读取文件内容并显示到控制台上(题目的第一个要求)。代码如下:
        // 向指定的txt文件中写入键盘输入的内容private static void writeToFile() {try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH1))) {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String line;System.out.println("请输入要写入文件的内容(输入exit结束):");while (!(line = reader.readLine()).equalsIgnoreCase("exit")) {writer.write(line);writer.newLine();}} catch (IOException e) {e.printStackTrace();}}
        // 重新读取文件内容并显示到控制台上private static void readFromFile() {try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH1))) {System.out.println("\n从文件中读取的内容:");String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}
  3. 题干第二个要求:如何实现成绩排序?推荐使用自定义的Comparator比较器。首先定义List<String>用于接收读取出来的结果,然后调用List对象的sort()进行排序,这里要传入的就是比较器。比较器中可以定义比较规则。

                lines.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int score1 = Integer.parseInt(o1.split(" ")[1]);int score2 = Integer.parseInt(o2.split(" ")[1]);return Integer.compare(score2, score1);}});

    注意,由于我们要比较的学生的成绩,也即我们输入内容的第2列,因此比较器或者说比较规则是一定要设置的,否则sort()方法并不知道我们要依据哪个内容来进行排序。关于比较器的内容这里不作补充,有需要的同学可以自行搜索Java的Comparator类进行了解。

源代码:

import java.io.*;
import java.util.*;public class S7_4 {private static final String FILE_PATH1 = "test.txt";private static final String FILE_PATH2 = "students.txt";public static void main(String[] args) {// 向指定的txt文件中写入键盘输入的内容writeToFile();// 重新读取文件内容并显示到控制台上readFromFile();// 键盘录入5个学生信息,并按成绩从高到低追加存入文件appendStudentInfoToFile();}// 向指定的txt文件中写入键盘输入的内容private static void writeToFile() {try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH1))) {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));String line;System.out.println("请输入要写入文件的内容(输入exit结束):");while (!(line = reader.readLine()).equalsIgnoreCase("exit")) {writer.write(line);writer.newLine();}} catch (IOException e) {e.printStackTrace();}}// 重新读取文件内容并显示到控制台上private static void readFromFile() {try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH1))) {System.out.println("\n从文件中读取的内容:");String line;while ((line = reader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {e.printStackTrace();}}// 键盘录入5个学生信息,并按成绩从高到低追加存入文件private static void appendStudentInfoToFile() {try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH2, true))) {Scanner scanner = new Scanner(System.in);for (int i = 0; i < 5; i++) {System.out.println("\n请输入学生信息(姓名 成绩):");String name = scanner.next();int score = scanner.nextInt();writer.write(name + " " + score);writer.newLine();}} catch (IOException e) {e.printStackTrace();}// 按成绩从高到低排序学生信息sortStudentInfoByScore();}// 按成绩从高到低排序学生信息private static void sortStudentInfoByScore() {List<String> lines = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH2))) {String line;while ((line = reader.readLine()) != null) {lines.add(line);}// 使用自定义的比较器按成绩从高到低排序lines.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int score1 = Integer.parseInt(o1.split(" ")[1]);int score2 = Integer.parseInt(o2.split(" ")[1]);return Integer.compare(score2, score1);}});} catch (IOException e) {e.printStackTrace();}// 将排序后的学生信息重新写入文件try (BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_PATH2))) {for (String line : lines) {writer.write(line);writer.newLine();}} catch (IOException e) {e.printStackTrace();}}
}

注意每次运行前,最好都确认一下两个提前准备好的文件是空的,或者没有格式非法的数据。 

列出测试数据和实验结果截图:

控制台

文件 

输入的内容
已排完序

5、复制指定目录中的指定类型(如.java)的文件到另一个目录中。

提前在Project目录下准备好要复制的文件:

 源代码:

import java.io.*;public class S7_5 {public static void main(String[] args) {String sourceDirectory = "source_directory"; // 源目录路径String destinationDirectory = "destination_directory"; // 目标目录路径String fileExtension = ".java"; // 要复制的文件类型copyFilesByExtension(sourceDirectory, destinationDirectory, fileExtension);}// 复制指定目录中指定类型的文件到另一个目录中private static void copyFilesByExtension(String sourceDirectory, String destinationDirectory, String fileExtension) {File sourceDir = new File(sourceDirectory);File destDir = new File(destinationDirectory);// 确保目标目录存在if (!destDir.exists()) {destDir.mkdirs();}// 检查源目录是否存在if (sourceDir.exists() && sourceDir.isDirectory()) {File[] files = sourceDir.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {return name.endsWith(fileExtension);}});if (files != null) {for (File file : files) {File destFile = new File(destDir, file.getName());try (InputStream in = new FileInputStream(file);OutputStream out = new FileOutputStream(destFile)) {byte[] buffer = new byte[1024];int length;while ((length = in.read(buffer)) > 0) {out.write(buffer, 0, length);}System.out.println("复制文件成功: " + destFile.getAbsolutePath());} catch (IOException e) {System.out.println("复制文件失败: " + file.getAbsolutePath());e.printStackTrace();}}} else {System.out.println("源目录中没有指定类型的文件");}} else {System.out.println("源目录不存在或不是目录");}}
}

列出测试数据和实验结果截图:

6、已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl”,请编写程序读取数据内容,把数据排序后写入ss.txt中。

s.txt内容:

源代码: 

import java.io.*;
import java.util.Arrays;public class S7_6 {public static void main(String[] args) {String sourceFileName = "s.txt"; // 源文件名String destinationFileName = "ss.txt"; // 目标文件名// 读取数据内容String data = readDataFromFile(sourceFileName);if (data != null && !data.isEmpty()) {// 排序数据内容String sortedData = sortString(data);// 写入到目标文件中writeDataToFile(destinationFileName, sortedData);} else {System.out.println("源文件中没有数据或文件不存在");}}// 读取数据内容private static String readDataFromFile(String fileName) {StringBuilder content = new StringBuilder();try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {String line;while ((line = reader.readLine()) != null) {content.append(line);}} catch (IOException e) {e.printStackTrace();}return content.toString();}// 对字符串进行排序private static String sortString(String input) {char[] chars = input.toCharArray();Arrays.sort(chars);return new String(chars);}// 将数据写入文件中private static void writeDataToFile(String fileName, String data) {try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName))) {writer.write(data);System.out.println("数据已写入文件 " + fileName);} catch (IOException e) {e.printStackTrace();}}
}

列出测试数据和实验结果截图:


三、实验总结

本次实验中我编写了Java程序实现IO控制,如利用File类和FileInputStream/FileOutputStream类实现了复制指定目录中指定类型的文件到另一个目录中的功能;使用BufferedReader/BufferedWriter类和OutputStreamWriter/InputStreamReader类完成从指定文件中读取数据内容,对其进行排序后写入到另一个文件中的任务的功能等。以下是我的总结:
1. 我学会了如何使用Java中的File类来进行文件和目录的操作,包括创建文件、删除文件、获取文件信息等。
2. 我掌握了如何使用FileInputStream和FileOutputStream类来进行文件的读取和写入操作,实现了文件的复制功能。
3. 我理解了BufferedReader和BufferedWriter类的作用,学会了如何利用它们来提高文件读写的效率。
4. 我了解了OutputStreamWriter和InputStreamReader的使用方法,学会了如何使用转换流来进行字符流和字节流之间的转换操作。
5. 初次接触OutputStreamWriter和InputStreamReader时,我对字符流和字节流之间的转换操作不太理解,特别是如何正确地使用转换流进行转换的过程。在实验中我也遇到了一些异常处理方面的问题,如捕获并处理文件操作出现的IOException。
6. 我通过阅读官方文档和查阅相关资料加深了对OutputStreamWriter和InputStreamReader的理解,解决了以上遇到的困难,同时结合实际代码练习,逐步掌握了它们的正确使用方法。

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

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

相关文章

C语言第十弹---函数(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数 1、函数的概念 2、库函数 2.1、标准库和头文件 2.2、库函数的使用方法 2.2.1、功能 2.2.2、头文件包含 2.2.3、实践 2.2.4、库函数文档的⼀般格式 …

c++实现常见排序算法

常见算法效率比较 冒泡排序&#xff1a;依次比较相邻数据并根据排序规则交换&#xff1b; 插入排序&#xff1a;将当前元素插入到当前元素之前的所有元素的最后一个大于/小于的位置&#xff0c;其他位置元素依次向后移动&#xff1b; 选择排序&#xff1a;对于每个位置&…

Azure Private endpoint DNS 记录是如何解析的

Private endpoint 从本质上来说是Azure 服务在Azure 虚拟网络中安插的一张带私有地址的网卡。 举例来说如果Storage account在没有绑定private endpoint之前&#xff0c;查询Storage account的DNS记录会是如下情况&#xff1a; Seq Name …

【Linux 基础】常用基础指令(上)

文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…

巨杉数据库携手广发证券入选2023大数据“星河”案例

近期&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续七年共同组织的大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动发布公示。本次征集活动&#xff0c;旨在通过总结和推广大数据产业发展的优秀成果&#xff0c;推动…

Jenkins邮件推送配置

目录 涉及Jenkins插件&#xff1a; 邮箱配置 什么是授权码 在第三方客户端/服务怎么设置 IMAP/SMTP 设置方法 POP3/SMTP 设置方法 获取授权码&#xff1a; Jenkins配置 从Jenkins主面板System configuration>System进入邮箱配置 在Email Extension Plugin 邮箱插件…

1.22ABM仿真(netlogo),A*(简要)

NETLOGO ABM建模 A* &#xff0c;体现了当前的步数成本 H为启发值&#xff0c;由启发性公式决定&#xff0c; 就是成本F由两个要素确定&#xff0c;一个是实际位置的成本G&#xff0c;由其自身固定的地理位置决定&#xff0c;另一个是启发值H&#xff0c;由下一个位置与目标…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

记签名机制

签名过程&#xff1a; 首先将数据源通过摘要算法获取到数字摘要 对数字摘要用私钥进行加密得到签名 将原始消息 以及签名发送给消息接收方 接收方用公钥解密得到数字摘要 用同样的摘要算法将原始消息进行计算 比较得到的数字摘要与解密后的是否一致 Android学习笔记——Androi…

Linux 驱动开发基础知识—— LED 驱动程序框架(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Oracle RAC 集群的安装(保姆级教程)

文章目录 一、安装前的规划1、系统规划2、网络规划3、存储规划 二、主机配置1、Linux主机安装&#xff08;rac01&rac02&#xff09;2、配置yum源并安装依赖包&#xff08;rac01&rac02&#xff09;3、网络配置&#xff08;rac01&rac02&#xff09;4、存储配置&#…

一款强大的矢量图形设计软件:Adobe Illustrator 2023 (AI2023)软件介绍

Adobe Illustrator 2023 (AI2023) 是一款强大的矢量图形设计软件&#xff0c;为设计师提供了无限创意和畅行无阻的设计体验。AI2023具备丰富的功能和工具&#xff0c;让用户可以轻松创建精美的矢量图形、插图、徽标和其他设计作品。 AI2023在界面和用户体验方面进行了全面升级…