java基础-chapter15(io流)

io流:存储和读取数据的解决方案

I:input         O:output

io流的作用:用于读写数据(本地文件,网络)

io流按照流向可以分为:

输出流:程序->文件

输入流:文件->程序

io流按照操作文件的类型可分类为:

字节流:可以操作所有类型的文件

字符流:只能操作纯文本文件(能用电脑自带记事本打开并且能读懂的文件)

File:表示系统中的文件或者文件夹的路径

获取文件信息(大小,文件名,修改时间) 判断文件的类型

创建文件/文件夹         删除文件/文件夹

注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据

字节流

FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写在本地文件中

步骤:

1.创建字节输出流对象

2.写数据

3.释放资源

FileOutputStream原理

通过创建对象 传入路径 使程序和文件产生数据传输通道

 FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");

通过调用write方法写入数据 

fos.write(97);

调用close方法释放资源(断开程序和文件之间的连接)

 fos.close();

FileOutputStream书写细节

创建字节输出流对象 

细节1:参数可以是字符串表示的路径或者是File对象

细节2:如果文件不存在,会创建一个新的文件,但是要保证父级路径是存在的

细节3:如果文件已经存在,则会清空文件

写出数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

释放资源

每次使用完流之后都要释放资源

FileOutputStream写数据的3种方式

一次写一个字节数组数据

public class ByteStreamDemo2 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");//一次写一个字节数组数据byte[] bytes = {97,98,99,100,101,102};//调用write方法将数组写入文件fos.write(bytes);//释放资源fos.close();}
}

一次写一个字节数组的部分数据

public class ByteStreamDemo3 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");/*void write(byte[] b,int off,int len)参数一:数组  参数二:起始索引  参数三:个数一次写一个字节数组的部分数据*/byte[] bytes = {97,98,99,100,101,102};//调用write方法将数组写入文件fos.write(bytes,2,2); //cd//释放资源fos.close();}
}

FileOutputStream写数据的两个小问题

换行写

public class ByteStreamDemo4 {public static void main(String[] args) throws IOException {/*换行写写出一个换行符Windows: \r\nLinux:   \nMac:     \r*/FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");//写出数据 huluyazhenshuaiString str = "huluyazhenshuai";//调用getBytes方法把字符串变成字节数组byte[] bytes = str.getBytes();
//        System.out.println(Arrays.toString(bytes));/*变成字节数组[104, 117, 108, 117, 121, 97, 122, 104, 101, 110, 115, 104, 117, 97, 105]*///调用write方法写入数据fos.write(bytes);String str2= "\r\n"; //写出换行符fos.write(str2.getBytes());String str3 = "666";fos.write(str3.getBytes());/*文件中的数据:huluyazhenshuai666*///释放资源fos.close();}
}

续写

如果想要续写,打开续写开关即可

开关位置:创建对象的第二个参数

默认false:表示续写,此时创建对象就可以清空文件

手动传递true;表示打开续写,此时创建对象不会清空文件

 FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt",true);

FileOutputStream小结

作用:可以把程序中的数据写到本地文件中,是字节流的基本流

书写步骤:创建对象        写出数据        释放资源

三步操作的细节:

创建对象: 文件存在(清空文件)  文件不存在(创建文件)  追加写入(true)

写出数据:写出整数  写出字节数组  换行写

释放资源:关闭通道

字节输入流的基本用法

FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

书写步骤

1.创建对象

2.读数据

3.释放资源

FileInputStream书写细节

1.创建对象

细节1:如果文件不存在,就直接报错

2.读数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾,read方法返回-1

3.释放资源

FileInputStream循环读取

public class FileInputStreamDemo2 {public static void main(String[] args) throws IOException {//字节输入流循环读取FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");//循环读取int b;while ((b = fis.read()) != -1) { //read:表示读取数据 并且读取一次数据就会移动一次指针System.out.println((char) b);}//释放资源fis.close();}
}

文件拷贝

public class FileInputStreamDemo3 {public static void main(String[] args) throws IOException {/*练习:文件拷贝*///创建对象FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\copy.txt");//拷贝  边读边写int b;while ((b = fis.read()) != -1){ fos.write(b);}//释放资源fos.close();fis.close();}
}

FileInputStream读取的问题

一次读写一个字节

public class FileInputStreamDemo4 {public static void main(String[] args) throws IOException {//一次读一个字节数组数据//创建对象FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");//创建数组//表示一次读两个数据byte [] bytes = new byte[2];//返回值len:表示本次读取到了多少个字节数据int len1 = fis.read(bytes);System.out.println(len1); //2String str1 = new String(bytes,0,len1);System.out.println(str1);int len2 = fis.read(bytes);System.out.println(len2); //2String str2 = new String(bytes,0,len2);System.out.println(str2);int len3 = fis.read(bytes);System.out.println(len3); //1String str3 = new String(bytes,0,len3);System.out.println(str3);fis.close();}
}

GBK和Unicode

  1. GBK:在GBK字符集中,每个中文字符占据两个字节。

  2. Unicode:Unicode字符集中,在UTF-8字符集中,中文字符通常占用3个字节的空间。UTF-8是一种可变长度的编码方案,用于表示Unicode字符集中的字符。对于常见的汉字,UTF-8编码通常占用3个字节,但对于罕见的汉字,也可能会占用更多的字节。

public class CharSetDemo1 {public static void main(String[] args) throws UnsupportedEncodingException {/*java中编码的方法public byte[] getBytes() 默认方式进行编码public byte[] getBytes(String charsetName) 指定方式进行编码java中解码的方法String (byte[] bytes) 默认方式进行解码String (byte[] bytes,String charsetName) 指定方式进行解码*///1.编码String str1 = "ai你哟";byte[] bytes1 = str1.getBytes();System.out.println(Arrays.toString(bytes1)); //[97, 105, -28, -67, -96, -27, -109, -97]byte[] bytes2 = str1.getBytes("GBK");System.out.println(Arrays.toString(bytes2)); //[97, 105, -60, -29, -45, -76]//解码String str2 = new String(bytes1);System.out.println(str2); //ai你哟String str3 = new String(bytes1,"GBK");System.out.println(str3); //ai浣犲摕}
}

字符流

FileReader

import java.io.FileReader;
import java.io.IOException;/*** @author hyk~*/
public class FileReaderDemo1 {public static void main(String[] args) throws IOException {//创建对象并关联本地文件FileReader fr = new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");//读取数据read()//字符流的底层也是字节流,默认也是一个字节一个字节的读取//但是遇到中文会一次读多个字节 GBK读2个 utf-8读3个int ch;while((ch = fr.read()) != -1){System.out.print((char) ch);/*read () 细节:1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个2.在读取之后,方法的底层还会进行解码并转成十进制。最终把这个十进制作为返回值 这个十进制的数据也表示在字符集上的数字英文: 文件里面二进制数据 0110 0001read方法进行读取,解码并转成十进制97中文: 文件里面的二进制数据 11100110 10110001 1001001read方法进行读取,解码并转成十进制27721如果想看到中文汉字,就把这些十进制数据,再进行强转就可以了 (char) ch*/}//释放资源fr.close();}
}

FileWriter

1.创建字符输出流对象

细节1:参数是字符串表示的路径或者File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

细节3:如果文件已存在,则会清空文件,如果不想清空可以打开续写开

2.写数据

细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

3.释放资源

细节:每次使用完流后都要释放资源

public class FileReaderDemo3 {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");fw.write("大家好,我是学生");fw.close();}
}

字节流和字符流使用场景

字节流

拷贝任意类型的文件

package itemIO;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** @author hyk~*/
public class Test1 {public static void main(String[] args) throws IOException {//拷贝一个文件夹,考虑子文件夹//创建对象表示数据源File src = new File("D:\\ideaProject\\src");//创建对象表示目的地File dest = new File("D:\\ideaProject\\src10086");//调用方法开始拷贝copyDir(src,dest);}/*作用:拷贝文件夹参数一:数据源参数二:目的地*/private static void copyDir(File src, File dest) throws IOException {dest.mkdirs();//递归//进入数据源File[] files = src.listFiles();//遍历数组for (File file : files) {//判断文件,拷贝if (file.isFile()) {FileInputStream fis = new FileInputStream(file);//要拷贝的文件FileOutputStream fos = new FileOutputStream(new File(dest,file.getName()));//文件目的地byte[] bytes = new byte[1024];int len;while ((len = fis.read(bytes)) != -1) {fos.write(bytes, 0, len);//bytes数组中从0索引开始,一共len个元素拷贝}fos.close();fis.close();}else {//判断文件夹,递归copyDir(file,new File(dest,file.getName())); //要拷贝的文件夹,目的地}}}
}

文件加密

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;/*** @author hyk~*/
public class Test2 {/*为了保证文件的安全性,就需要对原始文件进行加密存储再使用的时候再对其进行解密处理加密原理:对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新的文件中解密原理:读取加密之后的文件,按照加密的规则反向操作,变成原始文件*/public static void main(String[] args) throws IOException {//创建对象关联原始文件FileInputStream fis = new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\1.png");//创建对象关联加密文件FileOutputStream fos = new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\ency.png");//加密处理int b;while((b = fis.read()) != -1){fos.write(b ^ 10);}fos.close();fis.close();}
}

解密操作:

修改文件中的数据

package itemIO;import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;/*** @author hyk~*/
public class Test3 {/*文本文件中有以下的数据:2-1-9-4-7-8将文件中的数据进行排序,变成以下的数据:1-2-4-7-8-9*/public static void main(String[] args) throws IOException {//读取数据FileReader fr = new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");StringBuilder sb = new StringBuilder();int ch;while((ch = fr.read()) != -1){sb.append((char) ch);}fr.close();//排序String str = sb.toString();String [] arr = str.split("-");ArrayList list = new ArrayList();for (String s : arr) {int i = Integer.parseInt(s);list.add(i);}Collections.sort(list);//写出FileWriter fw = new FileWriter("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt");for (int i = 0; i < list.size(); i++){if (i == list.size() -1){fw.write(list.get(i) + "");}else {fw.write(list.get(i)+"-");}}fw.close();}
}

字节缓冲流

import java.io.*;/*** @author hyk~*/
public class BufferedStreamDemo2 {public static void main(String[] args) throws IOException {/*需求:利用字节缓冲流拷贝文件字节缓冲输入流的构造方法:public BufferedInputStream(Inputstream is)字节缓冲输出流的构造方法:public BufferedOutputstream(Outputstream os)*///创建缓冲流的对象BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\copy.txt"));//拷贝 一次读写多个字节byte[] bytes = new byte[1024];int len;while ((len = bis.read(bytes))!= -1){bos.write(bytes,0,len);}bos.close();bis.close();}
}

字符缓冲流

public class BufferedStreamDemo3 {public static void main(String[] args) throws IOException {/*字符缓冲输入流:构造方法:public BufferedReader(Reader r)特有方法:public String readLine()读一整行*///创建字符缓冲流的对象BufferedReader br = new BufferedReader(new FileReader("D:\\ideaProject\\study\\AdvancedJava3\\src\\itemIO\\a.txt"));//读取数据String line;while (((line = br.readLine()) != null)){System.out.println(line);}//释放资源br.close();}
}

字符流

读取纯文本文件中的数据

往纯文本文件中写出数据

转换流

转换流主要有两种类型:InputStreamReader OutputStreamWriter

它们的作用是在字节流和字符流之间建立桥梁,使得字节流能够以字符流的形式被读取,或者字符流能够以字节流的形式被写入。

创建转换流:

1. 创建 InputStreamReader
FileInputStream fis = new FileInputStream("input.txt"); // 创建字节输入流
InputStreamReader isr = new InputStreamReader(fis); // 创建转换流
2. 创建 OutputStreamWriter
FileOutputStream fos = new FileOutputStream("output.txt"); // 创建字节输出流
OutputStreamWriter osw = new OutputStreamWriter(fos); // 创建转换流

在创建转换流时,你可以选择是否指定字符集。如果不指定字符集,将会使用系统默认的字符集。例如,可以这样指定字符集:

InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 指定字符集为UTF-8
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); // 指定字符集为UTF-8

使用转换流:

1. 使用 InputStreamReader 读取文件内容:
BufferedReader br = new BufferedReader(isr); // 创建缓冲字符流
String line;
while ((line = br.readLine()) != null) {System.out.println(line); // 输出每一行内容
}
2. 使用 OutputStreamWriter 写入数据:
BufferedWriter bw = new BufferedWriter(osw); // 创建缓冲字符流
bw.write("Hello, world!"); // 写入字符串
bw.newLine(); // 写入换行符
bw.close(); // 关闭流

序列化流

序列化流在Java中是用来将对象转换为字节流的一种方式。主要用于对象的持久化存储或网络传输。Java提供了两种序列化流:ObjectOutputStream 用于将对象写入到流中,ObjectInputStream 用于从流中读取对象。

创建序列化流:

1. 创建 ObjectOutputStream
FileOutputStream fos = new FileOutputStream("object.dat"); // 创建字节输出流
ObjectOutputStream oos = new ObjectOutputStream(fos); // 创建序列化流
2. 创建 ObjectInputStream
FileInputStream fis = new FileInputStream("object.dat"); // 创建字节输入流 
ObjectInputStream ois = new ObjectInputStream(fis); // 创建反序列化流

使用序列化流:

1. 使用 ObjectOutputStream 写入对象:
MyObject obj = new MyObject(); // 创建一个自定义对象
oos.writeObject(obj); // 将对象写入流中
2. 使用 ObjectInputStream 读取对象:
MyObject obj = (MyObject) ois.readObject(); // 从流中读取对象,并进行类型转换

注意事项:

  1. 被写入流中的对象必须实现 Serializable 接口,否则会抛出 java.io.NotSerializableException 异常。
  2. 对象中的静态变量不会被序列化,因为静态变量属于类而不是对象。
  3. 有时候需要对某些敏感信息进行序列化时,可以使用 transient 关键字来标记不需要序列化的字段。
  4. 序列化的版本号可以通过 serialVersionUID 显式声明,以控制序列化对象的版本。
import java.io.*;class MyObject implements Serializable {private static final long serialVersionUID = 1L;private String name;public MyObject(String name) {this.name = name;}public String getName() {return name;}
}public class Main {public static void main(String[] args) {try {// 创建对象输出流FileOutputStream fos = new FileOutputStream("object.dat");ObjectOutputStream oos = new ObjectOutputStream(fos);// 写入对象MyObject obj1 = new MyObject("Object 1");oos.writeObject(obj1);// 关闭对象输出流oos.close();// 创建对象输入流FileInputStream fis = new FileInputStream("object.dat");ObjectInputStream ois = new ObjectInputStream(fis);// 读取对象MyObject obj2 = (MyObject) ois.readObject();System.out.println("Name: " + obj2.getName());// 关闭对象输入流ois.close();} catch (IOException | ClassNotFoundException e) {e.printStackTrace();}}
}

这段代码演示了如何创建和使用序列化流来序列化和反序列化对象。请确保在处理异常时进行适当的处理,比如打印错误信息或者进行其他的异常处理操作。

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

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

相关文章

nginx的安装002

之前001讲述了nginxyum安装现在讲一下nginx如何本地离线安装 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 首先访问nginx官网&#xff0c;下载。 用wget命令下载&#xff0c; [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.26.0.tar.gz …

python基础(习题、资料)

免费提取资料&#xff1a; 练习、资料免费提取。持续更新迅雷云盘https://pan.xunlei.com/s/VNz6kH1EXQtK8j-wwwz_c0k8A1?pwdrj2x# 本文为Python的进阶知识合辑&#xff0c;包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、字典&#xff08;Dic…

四川景源畅信:抖音开店怎么做好运营?

在数字化时代的浪潮中&#xff0c;抖音作为一个流量巨大的社交平台&#xff0c;为许多商家提供了展示和销售产品的新舞台。但在这个充满竞争的平台上&#xff0c;如何做好店铺运营&#xff0c;吸引并留住顾客&#xff0c;成为了许多商家面临的挑战。接下来的内容将围绕如何在抖…

程序启动端口占用问题 cause: Address already in use: bind

1、winr打开cmd窗口 2、找到占用端口的进程号 netstat -aon|findstr "20792" 3、终止进程 taskkill /T /F /PID 18208

实验---DC-AC逆变器(1)---EG8010+NSI6602驱动IGBT实验

一、设计电路 1.LCC 主回路模块原理图 1.1 电源部分 这个电源部分电路图是一个简单而有效的DC-DC转换器设计&#xff0c;包含输入保护和滤波、电源模块、以及输出滤波和稳定。 a. 输入电源部分 输入电源 (E12V): 电路从E12V端子接收12V的直流电源。这是整个电路的输入电源。…

活动选择问题(贪心法)

目录 问题概述 实例分析 代码实现 问题概述 实例分析 求解蓄栏保留问题。农场有n头牛,每头牛会有一个特定的时间区间[b,e]在蓄栏里挤牛奶,并且一个蓄栏里任何时刻只能有一头牛挤奶。现在农场主希望知道最少蓄栏能够满足上述要求,并给出每头牛被安排的方案。对于多种可行方案…

36个JavaScript特效教程,学完即精通

课程目录 &#x1f9d1;‍&#x1f4bb;36个JavaScript特效教程&#xff0c;学完即精通 &#x1f381;【更多好课】资源仓库&#xff0c;海量资源&#xff0c;无偿分享√ 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&…

【康耐视国产案例】智能AI相机联合OSARO为Zenni眼镜实现订单履约自动化

在电商潮流下&#xff0c;Zenni眼镜作为全球领先的在线眼镜零售商&#xff0c;每年销售超过600万副眼镜&#xff0c;却面临着一个独特而复杂的问题——需要通过扫描眼镜盒内的条形码来处理订单。传统手动处理已经到达流程瓶颈&#xff0c;急需一种更加自动化、可扩展的方法。为…

Hive-因精度丢失导致的 join 数据异常

一、问题复现 不知你是否遇到过 join 结果明显不匹配的情况&#xff0c;例如on t1.join_key t2.join_key中两个join_key明显不相等&#xff0c;但 join 的结果却将其匹配在一起。今日博主在通过用户 id 关联获取用户信息时发现一个用户 id 可以在用户维表中匹配出若干条&…

学生如何获取SOLIDWORKS产品技术支持

在当今日益复杂的学习环境中&#xff0c;技术软件如SOLIDWORKS已成为工程设计和制造类专业学生的重要工具。然而&#xff0c;面对这款功能强大的软件&#xff0c;学生们在使用过程中难免会遇到各种技术难题。那么&#xff0c;作为学生&#xff0c;我们该如何获取SOLIDWORKS产品…

imx6ull - 制作烧录SD卡

1、参考NXP官方的手册《i.MX_Linux_Users_Guide.pdf》的这一章节&#xff1a; 1、SD卡分区 提示&#xff1a;我们常用的SD卡一个扇区的大小是512字节。 先说一下i.MX6ULL使用SD卡启动时的分区情况&#xff0c;NXP官方给的镜像布局结构如下所示&#xff1a; 可以看到&#xff0c…

机器人控制系列教程之D-H参数建模法

机器人运动学的研究依赖于机器人的模型的建立&#xff0c;目前较为多见的两种方法分别是Denavit-Hartenberg建模法&#xff08;简称&#xff1a;D-H建模法&#xff09;。该方法时由Denavit和Hartenberg于19955年提出的一种为关节链中的每一个杆件建立一个坐标系的矩阵方法&…

LeetCode-131 分割回文串

LeetCode-131 分割回文串 题目描述解题思路C 代码 题目描述 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串。返回 s 所有可能的分割方案。 示例 1&#xff1a; 输入&#xff1a;s “aab” 输出&#xff1a;[[“a”,“a”,“b”],…

HTML跳动的爱心

目录 写在前面 HTML简介 跳动的爱心 代码分析 运行结果

AI大模型简史:萌芽、沉淀、爆发!

近一年来&#xff0c;随着ChatGPT爆火&#xff0c;大模型热潮席卷全球并持续升温&#xff0c;国内越来越多的知名高校、科研院所和创新型企业加大研究力度&#xff0c;大模型技术不断迭代升级&#xff0c;模型能力不断加强&#xff0c;逐渐形成从底层算力、模型开发到行业应用的…

蓝桥杯--LCA1

树上前缀和LCA 暴力做法&#xff1a; 我们先把不删的sum维护出来&#xff0c;然后遍历跳过的点&#xff0c;假如a1,a2,a3&#xff0c;跳过2&#xff0c;那么答案就是sum-cost(a1,a2)-cost(a2,a3)cost(a1,a3). DFS暴力&#xff0c;下面是代码&#xff1a; #include<bits/s…

【Unity脚本】使用脚本操作游戏对象的组件

【知识链】Unity -> Unity脚本 -> 游戏对象 -> 组件 【知识链】Unity -> Unity界面 -> Inspector【摘要】本文介绍如何使用脚本添加、删除组件&#xff0c;以及如何访问组件 文章目录 引言第一章 游戏对象与组件1.1什么是组件&#xff1f;1.2 场景、游戏对象与组…

php使用openssl返回false报错0308010C

本地php使用openssl返回false, 但是在服务器上测试正常openssl_encrypt($jsonStr, DES-ECB, $key, OPENSSL_RAW_DATA, ); 查看错误 openssl_error_string(); error:0308010C:digital envelope routines::unsupported 原因是: 服务器上的openssl是1.1版本, 本地是3.0版本 通…

C++回调函数

#include <iostream> #include <functional> // 为了使用 std::function // 声明一个回调函数类型 typedef std::function<void()> Callback11;// 调用函数&#xff0c;它接受一个回调函数作为参数 void process(Callback11 callback123) {// 在这里执…

直播领域新宠—第三代大模型无人直播系统:提升销售业绩的秘密武器

随着科技的飞速发展和人们对智能化生活的追求&#xff0c;直播领域也迎来了革新性的突破。第三代大模型无人直播系统&#xff0c;作为直播领域的新宠&#xff0c;正以其独特的魅力和优势&#xff0c;成为提升销售业绩的秘密武器。 首先&#xff0c;第三代大模型无人直播系统具…