当前位置: 首页 > news >正文

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流(一)

作者:blue

时间:2025.2.8

文章目录

  • 菜鸟之路Day15一一IO流(一)
    • 0.概述
    • 1.初识IO流
      • 1.1.什么是IO流?
      • 1.2.IO流的作用
      • 1.3.IO流的分类
    • 2.IO流的体系结构
    • 3.字节输出流的基本用法
    • 4.字节输入流的基本用法
    • 5.异常处理(了解即可)
    • 6.字符集
    • 7.字符输入流
      • 7.1FileReader
      • 7.2FileWriter
    • 8.IO流综合练习
      • 8.1练习一
      • 8.2练习二
      • 8.3练习三

0.概述

文章内容,学习自黑马程序员BV1yW4y1Y7Ms

1.初识IO流

1.1.什么是IO流?

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

1.2.IO流的作用

答:用于读写数据(本地文件,网络)

1.3.IO流的分类

按流的方向分

在这里插入图片描述

按操作文件的类型分

在这里插入图片描述

2.IO流的体系结构

在这里插入图片描述

3.字节输出流的基本用法

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

书写步骤:

①创建字节输出流对象

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

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

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

②写数据

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

③释放资源

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

package IOStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class FileOutputStreamDemo1 {public static void main(String[] args) throws IOException {FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt");//①创建字节输出流对象fos.write(97);//②写数据fos.close();//③释放资源}
}

写出数据的三种方式

public class FileOutputStreamDemo2 {public static void main(String[] args) throws IOException {/** void write(int b) 一次写一个字节数据* void write(byte[] b) 一次写一个字节数组数据** void write(byte[] b,int off,int len) 一次写一个字节数组的部分数据* 参数一:数组* 参数二:起始索引 0* 参数三:个数 3* */FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt");byte[] b = {97,98,99,100,101};fos.write(b,1,2);}
}

换行和续写

public class FileOutputStreamDemo3 {public static void main(String[] args) throws IOException {/** 换行符:*   windows:\r\n*   Linux:\n*   Mac:\r* 续写:*   打开续写开关即可,即创建对象的第二个参数*   默认是false表示关闭,创建对象会清空文件*   传递true,表示打开续写,此时创建对象不会清空文件* */FileOutputStream fos = new FileOutputStream("src\\IOStream\\a.txt",true);String str1 = "kcbdkdvkdkjxkjdkj";String str2 = "\r\n";String str3 = "666";byte[] b1 = str1.getBytes();byte[] b2 = str2.getBytes();byte[] b3 = str3.getBytes();fos.write(b1);fos.write(b2);fos.write(b3);}
}

4.字节输入流的基本用法

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

书写步骤:

①创建字节输入流对象

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

②读数据

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

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

③释放资源

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

public class FileInputStreamDemo1 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\IOStream\\a.txt");int ans = fis.read();while(ans!=-1){System.out.print((char)ans);ans = fis.read();}fis.close();//释放资源}
}

文件拷贝的基本代码

思想:边读边写

public class FileInputStreamDemo2 {public static void main(String[] args) throws IOException {//1.创建对象FileInputStream fis = new FileInputStream("C:\\Users\\zhangtenlan\\Desktop\\abc.txt");FileOutputStream fos = new FileOutputStream("src\\IOStream\\ans.txt");//2.拷贝//核心思想:边读边写int b;while((b=fis.read())!=-1){fos.write(b);}//3.释放资源//规则:先开的最后关闭fos.close();fis.close();}
}

以上方法在拷贝大文件的时候速度非常的慢,原因就在于,每次只能读取一个字节的数据,我们可以用read方法的一个重载来一次性读取多个数据。

public int read(byte[] buffer)  //一次读一个字节数组数据
//注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满
//长度尽量设置为1024的整数倍,不要太大,像1024*1024*5

例子:

public class FileInputStreamDemo3 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\IOStream\\ans.txt");byte[] b = new byte[2];int len;while((len=fis.read(b))!=-1){ //当读到的长度为-1时代表读完了System.out.print(new String(b,0,len));}fis.close();}
}

拷贝大文件的写法

public class FileInputStreamDemocratic {public static void main(String[] args) throws IOException {long start = System.currentTimeMillis();//记录开始时间//1.创建对象FileInputStream fis = new FileInputStream("大文件");FileOutputStream fos = new FileOutputStream("目标位置");//2.拷贝int len;byte[] bytes = new byte[1024*1024*5];while((len=fis.read(bytes))!=-1){fos.write(bytes,0,len);}//3.释放资源fos.close();fis.close();long end = System.currentTimeMillis();//记录结束时间System.out.println(end-start);//看看程序运行花了多少时间}
}

5.异常处理(了解即可)

try{}catch(IOException e){}finally{//finally中代码一定执行,除非JVM退出//所以释放资源的代码写到这里再合适不过
}

6.字符集

1.在计算机中,任意数据都是以二进制的形式来存储的

2.计算机中最小的存储单元是一个字节

3.ASCII字符集中,一个英文占一个字节

4.简体中文版Windows,默认使用GBK字符集

5.GBK字符集完全兼容ASCII字符集

注意:一个英文占一个字节,二进制第一位是0

一个中文占两个字节,二进制高位字节的第一位是1

6.Unicode字符集的UTF-8编码格式

​ 注意:一个英文占一个字节,二进制第一位是0,转成十进制是正数

​ 一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数

为什么会有乱码?

原因1:读取数据时未读完整个汉字

原因2:编码和解码时的方式不统一

Java中的解码和编码:

public class FileInputStreamDemo5 {public static void main(String[] args) throws UnsupportedEncodingException {/** java中的编码方法*   public byte[] getBytes() 使用默认方式进行编码UTF-8*   public byte[] getBytes(String charsetName) 使用指定方式进行编码** java中的解码方法*   String(byte[] bytes) 使用默认方式进行解码UTF-8*   String(byte[] bytes,String charsetName) 使用指定方式进行解码* */String str = "你好";byte[] res1 = str.getBytes();System.out.println(Arrays.toString(res1));System.out.println("=========================================================================");byte[] res2 = str.getBytes("GBK");System.out.println(Arrays.toString(res2));System.out.println("=========================================================================");String ans1 = new String(res1);System.out.println(ans1);System.out.println("=========================================================================");String ans2 = new String(res2,"GBK");System.out.println(ans2);}
}

7.字符输入流

在这里插入图片描述

字符流

​ 字符流 = 字节流+字符集

特点

​ 输入流:一次读一个字节,遇到中文时,一次读多个字节(所以适合处理中文)

​ 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景

​ 对于纯文本文件进行读写操作

书写步骤

​ ①创建字符输入流对象

​ ②读取数据

​ 注意:细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数

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

​ ③释放资源

7.1FileReader

public class IOTestOne {public static void main(String[] args) throws IOException {/** 第一步:创建对象* public FileReader(File file)  创建字符输入流关联本地文件* public FileReader(String pathname)** 第二步:读取数据* public int read() 读取数据,读到末尾返回-1* public int read(char[] buffer) 读取多个数据,读到末尾返回-1** 第三步:释放资源* public void close 释放资源* */FileReader fr = new FileReader("src\\IOTest\\a.txt");int ch;while((ch=fr.read())!=-1){System.out.print((char)ch);}fr.close();}
}/*有参的readFileReader fr = new FileReader("src\\IOTest\\a.txt");char[] chars = new char[2];int len;while((len=fr.read(chars))!=-1){//有参read返回值是System.out.print(new String(chars,0,len));}r.close();
*/

7.2FileWriter

①创建字符输出流对象

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

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

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

②写数据

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

③释放资源

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

public class IOTestTwo {public static void main(String[] args) {/** 第一步:创建对象*   public FileWriter(File file)*   public FileWriter(String pathname)*   public FileWriter(File file,boolean append) 续写开关*   public FileWriter(String pathname,boolean append)** 第二步:读取数据*   void write(int c)*   void write(String str)*   void write(String str,int off,int len)*   void write(char[] cbuf)*   void write(char[] cbuf,int off,int len)** 第三步:释放资源*   public void close() * */}
}

8.IO流综合练习

字节流和字符流的使用场景

​ 字节流:拷贝任意类型的文件

​ 字符流:读取纯文本文件中的数据,往纯文本文件中写出数据

8.1练习一

拷贝文件夹,考虑子文件夹

public class Test1 {public static void main(String[] args) throws IOException {File src = new File("C:\\Users\\zhangtenlan\\Desktop\\src");//数据源File dest = new File("C:\\Users\\zhangtenlan\\Desktop\\dest");//目的地copydir(src,dest);}private static void copydir(File src, File dest) throws IOException {dest.mkdirs();//1.进入数据源File[] arr = src.listFiles();//2.遍历数据源for(File file:arr){//3.如果是文件,则拷贝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);}fos.close();fis.close();}//4.如果是文件夹,则递归else {copydir(file,new File(dest,file.getName()));}}}
}

8.2练习二

文件加密

为了保证文件的安全性,就需要对原始文件进行加密存储,再使用的时候再对其进行解密处理。

加密原理:

​ 对原始文件中的每一个字节数据进行更改,然后将更改以后的数据存储到新文件中

解密原理:

​ 读取加密之后的文件,按照加密规则反向操作,变成原始文件

//完成这个功能,我们可以利用异或的原理
//加密,我们可以令每个字节都异或上一个数字
public class Test2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\yuan.png");FileOutputStream fos = new FileOutputStream("src\\jiami");int b;while((b=fis.read())!=-1){fos.write(b^5);}fos.close();fis.close();}
}
//解密,我们取原来加密过的图片,再次异或上这个数字
public class Test2 {public static void main(String[] args) throws IOException {FileInputStream fis = new FileInputStream("src\\jiami");FileOutputStream fos = new FileOutputStream("src\\jiemi.png");int b;while((b=fis.read())!=-1){fos.write(b^5);}fos.close();fis.close();}
}

8.3练习三

文本文件中有以下数据:2-1-9-4-7-8

将文本中的数据进行排序,变成以下数据:1-2-4-7-8-9

public class Test3 {public static void main(String[] args) throws IOException {//1.读取数据//纯文本文件,可以使用字符流来操作FileReader fr = new FileReader("src\\a.txt");StringBuilder sb = new StringBuilder();int b;while((b=fr.read())!=-1){sb.append((char)b);}fr.close();//2.排序ArrayList<Integer> list = new ArrayList<>();String[] arr = sb.toString().split("-");//分离-for (String s : arr) {//将数据转为整数类型,为排序做准备list.add(Integer.parseInt(s));}Arrays.sort(arr);//排序//3.写回FileWriter fw = new FileWriter("src\\b.txt");for (int i = 0; i < arr.length; i++) {if(i==arr.length-1) {fw.write(arr[i]+"");}else {fw.write(arr[i]+"-");}}fw.close();}
}

相关文章:

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.2.8 文章目录 菜鸟之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初识IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分类 2.IO流的体系结构3.字节输出流的基本…...

动手学Agent——Day2

文章目录 一、用 Llama-index 创建 Agent1. 测试模型2. 自定义一个接口类3. 使用 ReActAgent & FunctionTool 构建 Agent 二、数据库对话 Agent1. SQLite 数据库1.1 创建数据库 & 连接1.2 创建、插入、查询、更新、删除数据1.3 关闭连接建立数据库 2. ollama3. 配置对话…...

JSONObject,TreeUtil,EagelMap,BeanUtil使用

目录 JSONObject的使用 TreeUtil的使用 EagleMap使用 安装 application.yml配置 springboot导入依赖 配置信息 简单使用 如果想获取这个json字符串里面的distance的值 BeanUtil拷贝注意 JSONObject的使用 假如我现在要处理这样的json数据 可以直接使用JSONUtil.parseObj…...

Unity嵌入到Winform

Unity嵌入到Winform Winform工程&#x1f308;...

TCP/UDP协议与OSI七层模型的关系解析| HTTPS与HTTP安全性深度思考》

目录 OSI 7层模型每一层包含的协议&#xff1a; TCP和UDP协议&#xff1a; TCP (Transmission Control Protocol)&#xff1a; UDP (User Datagram Protocol)&#xff1a; 数据包流程图 TCP与UDP的区别&#xff1a; 传输层与应用层的关联 传输层和应用层的关联&#xf…...

《Zookeeper 分布式过程协同技术详解》读书笔记-2

目录 zk的一些内部原理和应用请求&#xff0c;事务和标识读写操作事务标识&#xff08;zxid&#xff09; 群首选举Zab协议&#xff08;ZooKeeper Atomic Broadcast protocol&#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一…...

缺陷检测之图片标注工具--labme

一、labelme简介 Labelme是开源的图像标注工具&#xff0c;常用做检测&#xff0c;分割和分类任务的图像标注。 它的功能很多&#xff0c;包括&#xff1a; 对图像进行多边形&#xff0c;矩形&#xff0c;圆形&#xff0c;多段线&#xff0c;线段&#xff0c;点形式的标注&a…...

机器学习_13 决策树知识总结

决策树是一种直观且强大的机器学习算法&#xff0c;广泛应用于分类和回归任务。它通过树状结构的决策规则来建模数据&#xff0c;易于理解和解释。今天&#xff0c;我们就来深入探讨决策树的原理、实现和应用。 一、决策树的基本概念 1.1 决策树的工作原理 决策树是一种基于…...

请解释一下Standford Alpaca格式、sharegpt数据格式-------deepseek问答记录

1 Standford Alpaca格式 json格式数据。Stanford Alpaca 格式是一种用于训练和评估自然语言处理&#xff08;NLP&#xff09;模型的数据格式&#xff0c;特别是在指令跟随任务中。它由斯坦福大学的研究团队开发&#xff0c;旨在帮助模型理解和执行自然语言指令。以下是该格式的…...

ubuntu 安装管理多版本python3 相关问题解决

背景&#xff1a;使用ubuntu 22.04 默认python 未3.10.编译一些模块的时候发现需要降级到python3.9.于是下载安装 下载&#xff1a; wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz解压与编译 tar -xf Python-3.9.16.tgz cd Python-3.9.16 ./configure -…...

滑动窗口算法篇:连续子区间与子串问题

1.滑动窗口原理 那么一谈到子区间的问题&#xff0c;我们可能会想到我们可以用我们的前缀和来应用子区间问题&#xff0c;但是这里对于子区间乃至子串问题&#xff0c;我们也可以尝试往滑动窗口的思路方向去进行一个尝试&#xff0c;那么说那么半天&#xff0c;滑动窗口是什么…...

Python爬虫实战:股票分时数据抓取与存储 (1)

在金融数据分析中&#xff0c;股票分时数据是投资者和分析师的重要资源。它能够帮助我们了解股票在交易日内的价格波动情况&#xff0c;从而为交易决策提供依据。然而&#xff0c;获取这些数据往往需要借助专业的金融数据平台&#xff0c;其成本较高。幸运的是&#xff0c;通过…...

【设计模式】【行为型模式】访问者模式(Visitor)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

基于实例详解pytest钩子pytest_generate_tests动态生成测试的全过程

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 作为一名软件开发人员&#xff0c;你一定深知有效测试策略的重要性&#xff0c;尤其…...

Copilot基于企业PPT模板生成演示文稿

关于copilot创建PPT&#xff0c;咱们写过较多文章了&#xff1a; Copilot for PowerPoint通过文件创建PPT Copilot如何将word文稿一键转为PPT Copilot一键将PDF转为PPT&#xff0c;治好了我的精神内耗 测评Copilot和ChatGPT-4o从PDF创建PPT功能 Copilot for PPT全新功能&a…...

2025百度快排技术分析:模拟点击与发包算法的背后原理

一晃做SEO已经15年了&#xff0c;2025年还有人问我如何做百度快速排名&#xff0c;我能给出的答案就是&#xff1a;做好内容的前提下&#xff0c;多刷刷吧&#xff01;百度的SEO排名算法一直是众多SEO从业者研究的重点&#xff0c;模拟算法、点击算法和发包算法是百度快速排名的…...

七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持

本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容&#xff0c;助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目&#xff0c;该版本修复了原版中的多个 系统漏洞&#…...

解锁原型模式:Java 中的高效对象创建之道

系列文章目录 后续补充~~~ 文章目录 一、引言1.1 软件开发中的对象创建困境1.2 原型模式的登场 二、原型模式的核心概念2.1 定义与概念2.2 工作原理剖析2.3 与其他创建型模式的差异 三、原型模式的结构与角色3.1 抽象原型角色3.2 具体原型角色3.3 客户端角色3.4 原型管理器角色…...

DeepSeek从入门到精通:揭秘 AI 提示语设计误区与 AI 幻觉(新手避坑指南)

文章目录 引言常见陷阱与应对策略&#xff1a;新手必知的提示词设计误区缺乏迭代陷阱&#xff1a;期待一次性完美结果过度指令与模糊指令陷阱&#xff1a;当细节缺乏重点或意图不明确假设偏见陷阱&#xff1a;当前 AI 只听你想听的幻觉生成陷阱&#xff1a;当AI自信地胡说八道忽…...

Jenkins同一个项目不同分支指定不同JAVA环境

背景 一些系统应用,会为了适配不同的平台,导致不同的分支下用的是不同的gradle,导致需要不同的JAVA环境来编译,比如a分支需要使用JAVA11, b分支使用JAVA17。 但是jenkins上,一般都是Global Tool Configuration 全局所有环境公用一个JAVA_HOME。 尝试过用 Build 的Execut…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中&#xff0c;Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染&#xff08;即CPU被阻塞&#xff09;&#xff0c;这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...