Java—IO 流

Java—IO 流

  • 🔍文件
    • 创建文件
    • 获取文件相关信息
    • 目录相关操作
  • 🔍IO 流
    • 理解流与文件
    • 流的分类
    • FileInputStream
    • FileOutputStream
    • 文件拷贝
    • FileReader
    • FileWriter
    • 节点流与处理流
      • 类型
    • BufferedReader
    • BufferedWriter
    • BufferedInputStream + BufferedOutputStream
    • 对象处理流
      • ObjectOutputStream
      • ObjectInputStream
      • 对象处理流注意事项
    • 标准输入输出流
    • 转换流
      • InputStreamReader
      • OutputStreamWriter
    • PrintStream
    • PrintWriter

🔍文件


文件, 计算机存储数据的一种方式

创建文件


下面列举了创建文件的 3 种方式, 包括

  1. File(String pathname), 指定路径名创建
  2. File(File parent, String child), 指定父抽象路径 + 子路径名创建
  3. File(String parent, String child), 指定父路径名 + 子路径名创建
public class FileCreate {public static void main(String[] args) {// create1();// create2();// create3();}// 创建方式 1, File(String pathname)public static void create1() {String pathName = "e:/test1.txt";File file = new File(pathName);try {boolean ret = file.createNewFile();if(ret) {System.out.println("文件创建成功");}} catch (IOException e) {e.printStackTrace();}}// 创建方式 2, File(File parent, String child)public static void create2() {String parentPath = "e:/";File parent = new File(parentPath);String child = "test2.txt";try {File file = new File(parent, child);boolean ret = file.createNewFile();if(ret) {System.out.println("文件创建成功");}} catch (IOException e) {e.printStackTrace();}}// 创建方式3, File(String parent, String child)public static void create3() {String parent = "e:/";String child = "test3.txt";try {File file = new File(parent, child);boolean ret = file.createNewFile();if(ret) {System.out.println("文件创建成功");}} catch (IOException e) {e.printStackTrace();}}}

获取文件相关信息


具体文章参考获取文件相关信息

  • file.getName(), 获取文件名
  • file.getAbsolutePath(), 获取文件绝对路径
  • file.getParent(), 获取文件父级目录
  • file.length(), 获取文件大小(单位: 字节)
  • file.exists(), 判断文件是否存在
  • file.isFile(), 判断是否为一个文件
  • file.isDirectory(), 判断是否为一个目录

目录相关操作


具体文章参考目录相关操作

  • file.exists(), 判断目录是否存在
  • file.delete(), 删除目录
  • file.mkdir(), 创建单级目录
  • file.mkdirs(), 创建多级目录

注意🍂

  • 执行删除目录命令时, 如果目录中存在文件, 则无法直接删除目录
  • 创建多级目录也可以应用于创建单级目录的情况

🔍IO 流


I, Input 的缩写, 表示输入
O, Output 的缩写, 表示输出

在这里插入图片描述

输入流, 数据从文件输入到程序(文件 → 程序)
输出流, 数据从程序输出到文件(程序 → 文件)

举个栗子🌰

你可以将程序看作是一个人, 将文件看作是水

在这里插入图片描述

将人喝水(水被输入到人的肚子中)的过程理解为输入流
人在喝水过程中被呛到了(水被重新洒到了杯子)的过程理解为输出流

理解流与文件


流与文件之间的关系类似于快递小哥与商品之间的关系

在这里插入图片描述

  • 将用户理解为程序
  • 将快递小哥送快递的过程理解为输入流 / 输出流
  • 将快递驿站理解为文件, 驿站中的快递(物品)理解为文件中的数据

快递小哥将快递(文件中的数据)送至用户家(程序) → 输入流
快递小哥将用户需要寄送的快递送至快递驿站 → 输出流

流负责数据的输入与输出

流的分类


  • 依据操作的对象划分为: (1) 字节流 (2) 字符流
  • 依据数据的流向划分为: (1) 输入流 (2) 输出流
抽象基类字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

在这里插入图片描述

FileInputStream


使用 FileInputStream 中的 read() 方法, 一次只能读取一个字节的内容
使用 FileInputStream 中的 read(byte[] b) 方法, 一次可以读取指定字节大小的内容

public class ReadFile {public static void main(String[] args) {// readFile1();// readFile2();}// 一次读取一个字节public static void readFile1() {String filePath = "e:/hello.txt";int readSize = 0;InputStream inputStream = null;try {inputStream = new FileInputStream(filePath);// 从文件中一次读取一个字节的数据. 返回 -1, 表示读到文件末尾while((readSize = inputStream.read()) != -1) {System.out.print((char) readSize);}} catch (IOException e) {e.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}// 一次读取多个字节public static void readFile2() {String filePath = "e:/hello.txt";int readSize = 0;// 从文件中一次读取 8 个字节的数据. 返回 -1, 表示读到文件末尾byte[] buffer = new byte[8];InputStream inputStream = null;try {inputStream = new FileInputStream(filePath);while((readSize = inputStream.read(buffer)) != -1) {// 注意不能写成 System.out.print(new String(buffer, 0, buffer.length));// 这是因为后续的 byte[] buffer 中的值由于第一次读取后的内容已经被填充System.out.print(new String(buffer, 0, readSize));}} catch (IOException e) {e.printStackTrace();} finally {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}}

FileOutputStream


使用 FileOutputStream 向指定的文件中写入内容时. 如果该文件不存在, 则会自动进行创建
使用 FileOutputStream 中的 write() 方法, 一次只能写入一个字节的内容
使用 FileOutputStream 中的 write(byte[] b) 方法, 一次可以写入指定字节大小的内容

FileOutputStream outputStream = new FileOutputStream(filePath) 再次执行程序时, 新写入的内容覆盖原有的内容
FileOutputStream outputStream = new FileOutputStream(filePath, true) 再次执行程序时, 新写入的内容会追加到原有内容的末尾

再次执行程序时, 指的是流被关闭后再次使用

public class WriteFile {public static void main(String[] args) {writeFile1();// writeFile2();}// 一次写入一个字节public static void writeFile1() {OutputStream outputStream = null;String filePath = "e:/test.txt";try {// 使用 FileOutputStream 向指定的文件中写入内容时// 如果该文件不存在, 则会自动进行创建outputStream = new FileOutputStream(filePath);// 当再次执行程序时, 新写入的内容覆盖原有的内容// outputStream = new FileOutputStream(filePath); // 当再次执行程序时, 新写入的内容会追加到原有内容的末尾  // outputStream = new FileOutputStream(filePath, true); outputStream.write('h');outputStream.write('e');outputStream.write('l');outputStream.write('l');outputStream.write('o');} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}// 一次写入多个字节public static void writeFile2() {OutputStream outputStream = null;String filePath = "e:/test.txt";try {// 使用 FileOutputStream 向指定的文件中写入内容时// 如果该文件不存在, 则会自动进行创建outputStream = new FileOutputStream(filePath);String str = "hello world";outputStream.write(str.getBytes());} catch (IOException e) {e.printStackTrace();} finally {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}}

文件拷贝


在这里插入图片描述

文件拷贝分为 2 步, 包括

  1. 读取源文件中的数据输入到程序(输入流)
  2. 从程序中输出数据到目标文件(输出流)

写入目标文件中的数据长度应该是读取到的长度, 不能是字节数组本身的长度
outputStream.write(buffer, 0, readSize)

注意🍂

拷贝文件时应每次读取部分数据时就写入目标文件, 不要一下子全部读取再写入目标文件
这是因为如果文件太大, 可能会导致执行过程崩溃

public class FileCopy {public static void main(String[] args) {copyFile();}// 文件拷贝// 1. 读取源文件的数据// 2. 将源文件的数据拷贝到目标文件路径public static void copyFile() {// srcFilePath 源文件路径(最好不要有中文)String srcFilePath = "D:/Csdn截图上传/Redis_01.png";// destFilePath 目标文件路径(最好不要有中文)String destFilePath = "E:/Redis2.png";InputStream inputStream = null;OutputStream outputStream = null;int readSize = 0;// 每次读取 1024 字节的数据byte[] buffer = new byte[1024];try {inputStream = new FileInputStream(srcFilePath);// 使用 FileOutputStream 向指定的文件中写入内容时// 如果该文件不存在, 则会自动进行创建outputStream = new FileOutputStream(destFilePath);while((readSize = inputStream.read(buffer)) != -1) {// 将读取到的内容写入到目标文件// outputStream.write(buffer);outputStream.write(buffer, 0, readSize);}} catch (IOException e) {e.printStackTrace();} finally {// 资源释放try {if(inputStream != null) {inputStream.close();}if(outputStream != null) {outputStream.close();}} catch (IOException e) {e.printStackTrace();}}}
}

FileReader


使用 FileReader 中的 read() 方法, 一次只能读取一个字符的内容
使用 FileReader 中的 read(char cbuf[]) 方法, 一次可以读取指定字符大小的内容

public class ReadFile {public static void main(String[] args) {// readFile1();// readFile2();}// 一次读取一个字符public static void readFile1() {Reader reader = null;String filePath = "e:/test.txt";int readSize = 0;try {reader = new FileReader(filePath);// 从文件中一次读取一个字符的数据. 返回 -1, 表示读到文件末尾while((readSize = reader.read()) != -1) {System.out.print((char) readSize);}} catch (IOException e) {e.printStackTrace();} finally {try {if(reader != null) {reader.close();}} catch (IOException e) {e.printStackTrace();}}}// 一次读取多个字符public static void readFile2() {Reader reader = null;String filePath = "e:/test.txt";int readSize = 0;char[] buffer = new char[1024];try {reader = new FileReader(filePath);// 从文件中一次读取多个字符的数据. 返回 -1, 表示读到文件末尾while((readSize = reader.read(buffer)) != -1) {System.out.print(new String(buffer, 0, readSize));}} catch (IOException e) {e.printStackTrace();} finally {try {if(reader != null) {reader.close();}} catch (IOException e) {e.printStackTrace();}}}}

FileWriter


使用 FileWriter 向指定的文件中写入内容时. 如果该文件不存在, 则会自动进行创建
使用 FileWriter 中的 write() 方法, 一次只能写入一个字符的内容
使用 FileWriter 中的 write(char[] cbuf)write(String str) 方法, 一次可以写入指定字符大小的内容

FileWriter writer= new FileWriter(filePath) 再次执行程序时, 新写入的内容覆盖原有的内容
FileWriter writer= new FileWriter(filePath, true) 再次执行程序时, 新写入的内容会追加到原有内容的末尾

再次执行程序时, 指的是流被关闭后再次使用

FileWriter 使用之后, 必须要关闭(close)或刷新(flush). 否则数据写入不到指定的文件中

public class WriteFile {public static void main(String[] args) {// writeFile1();// writeFile2();}public static void writeFile1() {Writer writer = null;String filePath = "e:/note.txt";try {writer = new FileWriter(filePath);writer.write('我');writer.write('亦');writer.write('无');writer.write('他');writer.write(',');writer.write('为');writer.write('手');writer.write('属');writer.write('尔');} catch (IOException e) {e.printStackTrace();} finally {try {// 表示使用过该字符流if(writer != null) {writer.close();}} catch (IOException e) {e.printStackTrace();}}}public static void writeFile2() {Writer writer = null;String filePath = "e:/note.txt";try {writer = new FileWriter(filePath);String str = "我亦无他, 为手熟尔";writer.write(str);} catch (IOException e) {e.printStackTrace();} finally {try {// 表示使用过该字符流if(writer != null) {writer.close();}} catch (IOException e) {e.printStackTrace();}}}}

节点流与处理流


节点流, 针对指定的数据源读写数据. 例如 FileReader, FileWriter 针对的数据源就是文件

处理流, 也叫包装流. 是连接在已存在的流(节点流或处理流)之上, 为程序提供更为强大的读写功能. 例如 BufferedReader, BufferedWriter

翻译一下就是节点流只能做指定的工作. 而处理流不仅能做指定的工作, 还能在指定的基础之上做额外的工作

类型


分类字节输入流字节输出流字符输入流字符输出流流类型
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderFileWriter节点流
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter节点流
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipedWriter节点流
访问字符串StringReaderStringWriter节点流
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter处理流
转换流InputStreamReaderOutputStreamWriter处理流
对象流ObjectInputStreamObjectOutputStream处理流
抽象基类FilterInputStreamFilterOutputStreamFilterReaderFilterWriter处理流
打印流PrintStreamPrintWriter处理流
推回输入流PushbackInputStreamPushbackReader处理流
特殊流DataInputStreamDataOutputStream处理流

BufferedReader


public class BFReadFile {public static void main(String[] args) throws IOException {readFile();}public static void readFile() throws IOException {String filePath = "e:/test.txt";BufferedReader reader = new BufferedReader(new FileReader(filePath));;String line = "";while((line = reader.readLine()) != null) {System.out.println(line);}reader.close();}}

BufferedWriter


public class BFWriter {public static void main(String[] args) throws IOException {writeFile();}public static void writeFile() throws IOException {String filePath = "e:/write.txt";// 表示以追加方式写入// BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true));// 表示以覆盖方式写入BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));writer.write("hello world");// writer.write('\n');writer.newLine(); // 插入一个和系统相关的换行符writer.write("hello world");// writer.write('\n');writer.newLine(); // 插入一个和系统相关的换行符writer.write("hello world");// writer.write('\n');writer.newLine(); // 插入一个和系统相关的换行符writer.close();}}

BufferedInputStream + BufferedOutputStream


利用 BufferedInputStream + BufferedOutputStream 实现文件拷贝

public class BufferedCopy {public static void main(String[] args) throws IOException {copyFile();}// 拷贝文件// 1. 读取源文件数据到程序(输入流)// 2. 将原文件数据从程序输入到目标文件(输出流)public static void copyFile() throws IOException {// 源文件路径String srcFilePath = "d:/活法.pdf";// 目标文件路径String descFilePath = "e:/稻盛和夫_活法.pdf";BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(srcFilePath));BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(descFilePath));int readSize = 0;byte[] buf = new byte[1024];// 1. 读取源文件数据到程序while((readSize = inputStream.read(buf)) != -1) {// 2. 将原文件数据从程序输入到目标文件(输出流)outputStream.write(buf, 0, readSize);// 刷新缓冲区outputStream.flush();}inputStream.close();outputStream.close();}}

对象处理流


对象处理流包括 ObjectInputStreamObjectOutputStream

通常利用 ObjectInputStreamObjectOutputStream 进行序列化与反序列化

对于序列化与反序列化的解释🍂

当我们保存数据时, 通常不会保存数据的类型

例如在 .txt 文件中保存写入 10 并保存, 此时并没有保存数据的类型. 此时我们无法确定 10 这个数据是整数还是字符串类型

在比如, 当我们保存一个浮点数 10.5 时, 虽然进行了保存, 但是无法确定这个浮点数的类型是 float 还是 double 类型

序列化的过程就是保存数据的类型 + 数据的值

反序列化的过程就是将保存数据的类型 + 数据的值

举个栗子🌰

// 示例代码
public class Student {private int id;private String name
}

定义一个学生类, 属性包括 id, name

如果只保存一个 id 的值 + name 的值. 例如 id = 10, name = “嘟嘟”. 此时我们并没有办法判断这些属性描述的具体对象. 可以是学生, 老师, 也可能是一只宠物

序列化的过程就是保存了数据的类型 + 数据的值, 也就是说将值所描述的对象一同进行保存

而反序列化的过程就是在恢复数据时, 恢复保存了的数据 + 数据的值

实现序列化的过程需要该类实现下列的任意一个接口

  • Serializable
  • Externalizable

通常选择实现 Serializable 接口, 因为这只是一个标记接口, 里面并不包含抽象方法

在这里插入图片描述

ObjectOutputStream


public class ObjOutput {public static void main(String[] args) throws IOException {writeFile();}public static void writeFile() throws IOException {String filePath = "e:/t1.txt";ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(filePath));outputStream.writeInt(100);outputStream.writeChar('a');outputStream.writeUTF("hello world");outputStream.writeObject(new Student(1, "Tom"));outputStream.close();System.out.println("序列化完成");}}

Student 类🍂

public class Student implements Serializable {private int id;private String name;public Student(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +'}';}
}

ObjectInputStream


public class ObjInput {public static void main(String[] args) throws IOException, ClassNotFoundException {readFile();}public static void readFile() throws IOException, ClassNotFoundException {String filePath = "e:/t1.txt";ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(filePath));System.out.println(inputStream.readInt());System.out.println(inputStream.readChar());System.out.println(inputStream.readUTF());System.out.println(inputStream.readObject());inputStream.close();System.out.println("反序列化完成");}}

对象处理流注意事项


  1. 读写顺序需要保持一致
  2. 序列化或反序列化的对象, 需要实现 SerializableExternalizable 接口
  3. 序列化的类中建议添加 SerialVersionUID, 以便提高版本兼容性
  4. 序列化对象时, 默认将对象中的所有属性都进行序列化(被 statictransient 修饰的成员不会序列化)
  5. 序列化对象时, 要求对象中的属性也实现序列化的接口
  6. 序列化具备可继承性. 即某个类实现了序列化, 那么它的子类也默认实现了序列化

标准输入输出流


System.in 标准输入 → 默认对应设备为键盘

  • System.in 编译类型为 InputStream
  • System.in 运行类型为 PrintStream

System.out 标准输出 → 默认对应设备为显示器

  • System.out 编译类型为 PrintStream
  • System.out 运行类型为 PrintStream

转换流


转换流包括 InputStreamReaderOutputStreamReader

转换流通常用于解决乱码问题. 这是因为InputStreamReaderOutputStreamReader 的构造方法中都可以指定字符编码

在这里插入图片描述

在这里插入图片描述

InputStreamReaderReader 的子类, 可以将 InputStream(字节流) 包装为 Reader(字符流)
OutputStreamReaderWriter 的子类, 可以将 OutputStream(字节流) 包装为 Writer(字符流)

InputStreamReader


public class InputReadFile {public static void main(String[] args) throws IOException {readFile();}public static void readFile() throws IOException {String filePath = "e:/copyFile.pdf";FileInputStream inputStream = new FileInputStream(filePath);// 将 FileInputStream 转换为 InputStreamReader// 指定编码格式为 UTF-8InputStreamReader reader = new InputStreamReader(inputStream, "gbk");// 将 InputStreamReader 转换为 BufferedReaderBufferedReader bfReader = new BufferedReader(reader);while(bfReader.readLine() != null) {System.out.println(bfReader.readLine());}bfReader.close();}}

OutputStreamWriter

public class OutputWriteFile {public static void main(String[] args) throws IOException {writeFile();}public static void writeFile() throws IOException {String filePath = "e:/test.txt";FileOutputStream outputStream = new FileOutputStream(filePath);// 设置编码格式// OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);OutputStreamWriter writer = new OutputStreamWriter(outputStream, "gbk");BufferedWriter bfWriter = new BufferedWriter(writer);bfWriter.write("hello, world");bfWriter.newLine();bfWriter.write("做到才能得到");bfWriter.close();}}

PrintStream


public class ExPrintStream {public static void main(String[] args) throws IOException {// print1();// print2();}// 未设置打印位置// 默认将打印结果输出到显示器public static void print1() {PrintStream stream = System.out;stream.println("hello world");stream.println("做到才能得到");stream.close();}// 设置打印位置public static void print2() throws IOException {String filePath = "e:/test.txt";System.setOut(new PrintStream(filePath));System.out.println("输出结果到指定位置");System.out.close();}}

PrintWriter


public class ExPrintWriter {public static void main(String[] args) throws IOException {// print1();print2();}// 为指定输出位置// 默认将打印结果输出到显示器public static void print1() {PrintWriter writer = new PrintWriter(System.out);writer.println("hello world");writer.println("hello myFriend");writer.close();}// 指定输出位置public static void print2() throws IOException {String filePath = "e:/test.txt";PrintWriter writer = new PrintWriter(new FileWriter(filePath));writer.println("hello world");writer.println("hello myFriend");writer.close();}}

🌸🌸🌸完结撒花🌸🌸🌸

在这里插入图片描述

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

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

相关文章

Leetcode-每日一题【剑指 Offer 18. 删除链表的节点】

题目 给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。 返回删除后的链表的头节点。 注意:此题对比原题有改动 示例 1: 输入: head [4,5,1,9], val 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调…

备战大型攻防演练,“3+1”一套搞定云上安全

在重大活动保障期间,企业不仅要面对愈发灵活隐蔽的新型攻击挑战,还要在人员、精力有限的情况下应对不分昼夜的高强度安全运维任务。如何在这种多重压力下,从“疲于应付”迈向“胸有成竹”呢? 知己知彼,百战不殆&#…

用户体验旅程图:改进用户体验的好工具

用户体验旅程图:改进用户体验的好工具 怎么改进体验,是有方法的 用户情绪曲线来衡量用户感觉 趣讲大白话:没有流程刨析,就没法改进 【趣讲信息科技245期】 **************************** 企业管理需要基本的流程的 企业流程简称BP…

docker容器监控:Cadvisor+InfluxDB+Grafana的安装部署

目录 CadvisorInfluxDBGrafan安装部署 1、安装docker-ce 2、阿里云镜像加速器 3、下载组件镜像 4、创建自定义网络 5、创建influxdb容器 6、创建Cadvisor 容器 7、查看Cadvisor 容器: (1)准备测试镜像 (2)通…

pycharm、idea、golang等JetBrains其他IDE修改行分隔符(换行符)、在Git CRLF、LF 换行符转换

文章目录 pycharm、idea、golang系列修改行分隔符我应该选择什么换行符JetBrains IDE,默认行分隔符 是跟随系统修改JetBrains IDE,默认行分隔符 在Git CRLF、LF 换行符转换需求Git 配置选项 pycharm、idea、golang系列修改行分隔符 一般来说,不同的开发…

【陈老板赠书活动 - 10期】- 【Python之光:Python编程入门与实战】

陈老老老板🦸 👨‍💻本文专栏:赠书活动专栏(为大家争取的福利,免费送书) 👨‍💻本文简述:生活就像海洋,只有意志坚强的人,才能到达彼岸。讲一些我刚进公司的学…

solidworks(2)

记得选择双向

【解放ipad生产力】如何在平板上使用免费IDE工具完成项目开发

我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code3o19zyy2pneoo 前言 很多人应该会像我一样吧,有时候身边没电脑突然要写项目,发现自己的平板没有一点作用&…

手机开启应急预警通知 / 地震预警

前言 安卓手机在检测到地震时,将发送地震预警通知,但此设置是默认关闭的,原因是以防引发用户恐慌从而引发安全问题,且开启此设置需要完成指引教程,因此默认关闭此设置。下文介绍如何开启此设置。 开启方法 华为手机开…

未来C#上位机软件发展趋势

C#上位机软件迎来新的发展机遇。随着工业自动化的快速发展,C#作为一种流行的编程语言在上位机软件领域发挥着重要作用。未来,C#上位机软件可能会朝着以下几个方向发展: 1.智能化:随着人工智能技术的不断演进,C#上位机…

【CHI】架构介绍

Learn the architecture - Introducing AMBA CHI AMBA CHI协议导论--言身寸 1. AMBA CHI简介 一致性集线器接口(CHI)是AXI一致性扩展(ACE)协议的演进。它是Arm提供的高级微控制器总线架构(AMBA)的一部分。…

【VisualGLM】大模型之 VisualGLM 部署

目录 1. VisualGLM 效果展示 2. VisualGLM 介绍 3. VisualGLM 部署 1. VisualGLM 效果展示 VisualGLM 问答 原始图片 2. VisualGLM 介绍 VisualGLM 主要做的是通过图像生成文字,而 Stable Diffusion 是通过文字生成图像。 一种方法是将图像当作一种特殊的语言进…

使用node搭建服务器,前端自己写接口,将vue或react打包后生成的dist目录在本地运行

使用node.jsexpress或者使用node.jspm2搭建服务器,将vue或react打包后生成的dist目录在本地运行 vue项目打包后生成的dist目录如果直接在本地打开index.html,在浏览器中会报错,无法运行起来。 通常我是放到后端搭建的服务上面去运行,当时前端…

高速公路巡检新手段——道路智能巡检系统

高速公路作为我国公路建设的一项重要成果,其建设和运营对于促进我国经济发展、改善交通运输条件和提高人民生活水平具有重要的意义。 高速公路巡检是确保公路安全的重要措施之一。每年数以万计的车辆在高速公路上穿行,因此高速公路的安全性显得尤为重要。…

objectMapper.configure 方法的作用和使用

objectMapper.configure 方法是 Jackson 提供的一个用于配置 ObjectMapper 对象的方法。ObjectMapper 是 Jackson 库的核心类,用于将 Java 对象与 JSON 数据相互转换。 configure 方法的作用是设置 ObjectMapper 的配置选项,例如设置日期格式、设置序列…

React源码解析18(2)------ FilberNode,FilberRootNode结构关系

摘要 在上一篇,我们实现了通过JSX转换为ReactElement的方法,也看到了转换后React元素的结构。但是这个React元素,并不能很清楚的表达组件之间的关系,以及属性的处理。 所以在React内部,会将所有的React元素转换为Fil…

解决mysql常见错误,安装mysql提示Install/Remove of the service Denied!/显示无法启动/服务名无效

​​​​​1.概述问题 1.1 在安装mysql中提示Install/Remove of the service Denied! 1.2 MySQL 服务没有加载到电脑上时,有以下原因: 1.2.1 端口被占用,需要更改端口,也可以卸载重装mysql。 1.2.2 启动 MySQL 服务是就会提示 服务…

mysql之mha高可用

目录 一、MHA的相关知识 1)什么是 MHA 2)MHA 的组成 (1)MHA Node(数据节点) (2)MHA Manager(管理节点) 3)MHA 的特点 二、MHA的一主两从部…

并发——什么是线程死锁?如何避免死锁?

文章目录 1. 认识线程死锁2. 如何避免线程死锁? 1. 认识线程死锁 线程死锁描述的是这样一种情况:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 如下图所示&#xff…

一位年薪40W的测试被开除,回怼的一番话,令人沉思

一位年薪40W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…