【JavaEE】——文件IO
阿华代码,不是逆风,就是我疯
你们的点赞收藏是我前进最大的动力!!
希望本文内容能够帮助到你!!
目录
一:认识文件
1:文件的概念
2:文件的结构
3:文件路径
(1)绝对路径
(2)相对路径
(3)举例
二:文件的分类
1:文本文件
2:二进制文件
3:如何判断文件的种类
三:Feil类对文件操作
1:Feil类
2:File类的构造方法
3:获取属性方法
代码示例一
代码示例二
4:判断方法
5:创建删除方法
6:创建移动方法
7:创建File对象代表的目录
8:文件改名操作
四:文件流
五:字节流
1:InputStream
(0)打开文件
(1)构造方法
(2)类/异常解析
(3)文件资源泄露
(4):read方法
①引入
②三种参数代码示例
2:OutputStream
3:Scanner联动
编辑
六:字符流
1:Reader类
2:Writer类
一:认识文件
1:文件的概念
对于计算机来说,“文件”是一个非常广义的概念,可以指普通的文件,文件夹,一些硬件设备也被抽象成了文件(例如:键盘,耳机,显示器,网卡等)
对于机械硬盘来说它更加擅长顺序读写,不擅长随机读写
比如有一个很大的文件,我们需要把这个文件整体复制一份就是顺序读写
某个目录中有很多的小文件,(数目比较多)需要把整个目录都拷贝一份,就是随机读写。
2:文件的结构
文件系统的结构是按照“树形结构”来组织文件的,是N叉树,一个普通文件(非目录)就是一个叶子节点,对一个目录文件来说,里面又可以有很多的子节点
3:文件路径

形如上述的图片,从树根节点,一级一级的往下走,直到直到目标文件,这个过程中经过的所有文件目录的名字串起来,使用正斜杠——“/”,或者反斜杠——“\”分割,就构成了“路径”
注:此过程并非是遍历树,可以想象成类似于Hash这样的结构
(1)绝对路径
从树根节点 出发,一层一层到达目标文件
(2)相对路径
先指定一个“当前目录”/“基准目录”,从当前目录出发,找到目标文件
(3)举例

二:文件的分类
1:文本文件
文本文件是按照“字符串”的形式来理解文本内容的(文本文件里面的二进制内容,也都表示为字符串,可以理解为——二进制内容都是合法的字符(像字符编码,英文字母用ASCII,汉字用utf8/gbk))
举例:.java .c .cpp 文本文档
2:二进制文件
二进制文件没有上述的限制,储存任何数据都可以。
举例:图片,音频,可执行程序,动态库,.class文件,富文本文件
富文本文件包括不限于:word docx excle xlsx power point pptx
3:如何判断文件的种类
使用记事本打开文本文件,如果看到的是乱码,就是二进制文件
三:Feil类对文件操作
引入:在Java中,对于文件操作的Api这里有两类
针对文件系统的操作:创建,删除,重命名,
针对文件内容的操作:读文件,写文件
1:Feil类

2:File类的构造方法

3:获取属性方法

代码示例一
构造File用绝对路径
import java.io.File;
import java.io.IOException;public class IO1 {public static void main(String[] args) throws IOException {File f = new File("C:/User/1/test.txt");//绝对路径//File f = new File("./test.txt");System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}

代码示例二
构造对象用相对路径
.getPath()得到的就是构造方法中的参数
Canonical(读音:克挠你扣)规范的——可以理解为化简路径
import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 19:28*/
public class IO1 {public static void main(String[] args) throws IOException {//File f = new File("C:/User/1/test.txt");//绝对路径File f = new File("./test.txt");System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());//返回父目录文件路径System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}

4:判断方法



我们可以使用file.createNewFile(如下代码),也可以直接手动在当前目录创建一个File文件——名字叫test.txt
import java.io.File;
import java.io.IOException;public class IODemon2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());//文件存在吗System.out.println(file.isFile());//是普通文件嘛System.out.println(file.isDirectory());//是目录吗boolean ret = file.createNewFile();//创建文件;返回的结果就是创建成功和创建失败System.out.println("ret:" + ret);}}

5:创建删除方法
file.delete删除文件,返回值类型为boolean类型
file.deleteNewFile退出时删除文件,返回值为void
注:删除目录只能一级一级的删除
import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:17*/
public class IODemon3 {public static void main(String[] args) throws IOException, InterruptedException {File file = new File("./test.txt");//boolean ret = file.delete();//删除文件//System.out.println(ret);boolean ret = file.createNewFile();//创建文件file.deleteOnExit();//返回值为void类型,退出的时候删除文件,测试的时候注意看左边的目录栏Thread.sleep(5000);}}
6:创建移动方法
import java.io.File;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:44*/
public class IODemon4 {public static void main(String[] args) {File file = new File(".");//返回的是对象代表的目录下所有的文件//返回的是一个String[]类型的数组String[] files = file.list();System.out.println(Arrays.toString(files));//返回的file对象代表的目录下所有的文件,不过是以file对象表示File[] files2 = file.listFiles();System.out.println(Arrays.toString(files2));}
}

7:创建File对象代表的目录
import java.io.File;
import java.lang.reflect.Field;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:58*/
public class IODemon5 {public static void main(String[] args) {/* File file = new File("./aaa");//创建file为对象的目录boolean ret = file.mkdir();System.out.println(ret);*//* File file = new File("./bbb");boolean ret2 = file.mkdirs();//mkdirs(可以用于创建单个目录,也可以用于创建多级目录)System.out.println(ret2);*//*File file = new File("./aaa/bbb/ccc");boolean ret2 = file.mkdirs();//mkdirs(可以用于创建单个目录,也可以用于创建多级目录)System.out.println(ret2);*/File file = new File("./bbb");boolean ret = file.delete();//删除只能一级目录一级目录的删System.out.println(ret);}
}
8:文件改名操作
注意细节:file1文件改名为file2对象
import java.io.File;public class IODemon6 {public static void main(String[] args) {File file1 = new File("./aaa/bbb/ccc/bbb");File file2 = new File("./bbb");boolean ret = file2.renameTo(file1);//把bbb这个文件移入"./aaa/bbb/ccc"的/ccc下System.out.println(ret);}}

四:文件流
什么是文件流呢?
举个例子:要写100字节的内容,我们可以分10次写每次写10字节的内容,也可以分5次来写,每次写20字节的内容;当然也可以一次性写完
“流”是操作系统提供的概念,Java标准库中对于“进行了”封装,提供了一组类来负责这些工作
我们把这些类主要分为两种:字节流和字符流
五:字节流
代表类:InputStream——输入流,OutPutStream——输出流
1:InputStream
(0)打开文件
按照读文件的方式打开一个文件
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 11:46*/
public class IODemon7 {public static void main(String[] args) throws IOException {/*//打开文件InputStream inputStream = new FileInputStream("./test.txt");//在中间一定会涉及一些对文件的操作之类的,如果遇到bug或者像return之类的不可控的操作,close操作可能就会执行不到了//打开了文件最后还要关掉,打开文件操作会抛出FileNotFoundException异常inputStream.close();//关闭文件会抛出IOException异常,前后两者为父类子类的关系*//*//第二种写法InputStream inputStream = null;try {inputStream = new FileInputStream("./test.txt");}finally{inputStream.close();}*//*//第三种写法,try with resources版本try (InputStream inputStreeam = new FileInputStream("./test.txt")){//出了try{}代码块范围后,编译器会自动调用.close方法关闭文件//FileInputStream继承于InputStream,InputStream又实现了Closeable接口,必须实现了Closeable接口才可以被放到try()里面}*/}}
(1)构造方法

注:你给cpu送的信息叫输入,比如读操作。cpu给存储器等这些硬件设备送的信息叫做输出,比如写操作
(2)类/异常解析


(3)文件资源泄露
如果不执行文件关闭.close方法,就会有大问题。这里本质上是释放了文件的相关资源(PCB文件描述符表,不懂得铁子可以看前面写过的文章)这个表本质是一个数组或者顺序表,每打开一个文件,就会占据一个位置,如果不关闭一直打开就会导致表被耗尽,后续再想打开就会报错。
那么提问,文件描述符表不会动态扩容吗?对操作系统的内核来说,需要很高的性能,付出的代价太大了,容易造成系统的卡顿
(4):read方法
①引入
read读文件就是把硬盘数据读取到内存当中buffer,译为缓冲区

注意点①:offset此处缩写了
注意点②:传入的数组,在方法内部对数组内容修改过后,方法外部也能生效
注意点③:字符流读取文件的时候,
②三种参数代码示例
①*不带参数的读,一个一个字符的读
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:18*/
public class IOStream8 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){//读取操作,读到-1的时候就会停止while(true){int a = inputStream.read();if (a == -1){break;}System.out.print(a + " ");//读取的abcdef是ascii码值}}}
}

②*带入数组参数的读取,一次读取多个字符
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:56*/
public class IODemon9 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer = new byte[1024];//读的时候会尝试把buffer[1024]填满int n = inputStream.read(buffer);//传入的参数是buffer数组,方法内部对数组内容进行修改后,方法外部也能生效,实际上填不满1024个字节,if (n == -1){break;//读取到最后一个字符,就break}for (int i = 0; i < n; i++) {System.out.printf(" %x " ,buffer[i]);//遍历数组,并打印}}}}
}


③*构造String从0读到n(利用offset)
offset翻译为抵消补偿
注意看while循环:什么是文件流,假设我们要读取的文件很大,在这个循环中,每次尽可能读取1024个字节(可能读到的字节数比这个要小),这次读不完,我们就先用String给存起来(0到n),下一次while循环就接着读,“特别像字符串拼接 ”
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 13:22*/
public class IODemon10 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer = new byte[1024];//读的时候会尝试把buffer[1024]填满int n = inputStream.read(buffer);//传入的参数是buffer数组,方法内部对数组内容进行修改后,方法外部也能生效if (n == -1){break;}String string = new String(buffer , 0 , n);//构造一个String对象,数组前n个字节来构造System.out.printf(string);//遍历数组,并打印}}}
}

2:OutputStream
按照写的方式打开文件

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:06*/
public class IODemo11 {public static void main(String[] args) throws FileNotFoundException {try{//打开操作会把原有文件中的内容清空,所以罪魁祸首不是Write操作而是打开操作OutputStream outputStream = new FileOutputStream("./test.txt");//OutputStream outputStream = new FileOutputStream("./test.txt",true);追加写byte[] buffer = new byte[]{97,98,99,100,101};outputStream.write(buffer);}catch (IOException e) {throw new RuntimeException(e);}}
}
3:Scanner联动
Scanner(System.in)中System.in本质就是一个InputStream
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:21*/
public class IODemo14 {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream = new FileInputStream("./test.txt")){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String s = scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}
六:字符流
以字符为单位进行读写,例如:用utf8表示汉字,3个字节就是一个汉字,每次读写都得以3个字节为单位来进行读写,不能一次读半个汉字
在用char类型的数组存储汉字时是把3个字节组成的utf8汉字转化为了Unicode,输出为String类型时在把Unicode转化为字节
代表类:Reader——输入,Writer——输出
1:Reader类
代码示例
把byte换为char测试一下,区别在于打印汉字
import java.io.*;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:33*/
public class IODemo12 {public static void main(String[] args) {try{//Reader和Writer的字符流与OutputStream和InputStream相似Reader reader= new FileReader("./test.txt");while(true){char[] buffer = new char[1024];int n = reader.read(buffer);if (n == -1){break;}String s = new String(buffer , 0 , n);System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

如果文件中有内容换行操作了,那么有可能会有一些内容打印不到



2:Writer类
记住:要把文件打开操作放到try()的括号里,要不然不会默认执行close关闭文件操作
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:07*/
public class IODemo13 {public static void main(String[] args) {try(Writer writer = new FileWriter("./test.txt",true)) {String s = "可选择续写操作 或者 清空在写操作";writer.write(s);} catch (IOException e) {throw new RuntimeException(e);}}
}

相关文章:
【JavaEE】——文件IO
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:认识文件 1:文件的概念 2:文件的结构 3:文件路径…...
Python的pandas库基本操作(数据分析)
一、安装,导入 1、安装 使用包管理器安装: pip3 install pandas 2、导入 import pandas as pd as是为了方便引用起的别名 二、DateFrame 在Pandas库中,DataFrame 是一种非常重要的数据结构,它提供了一种灵活的方式来存储和…...
软件测试(平铺版本)
目录 黑盒测试: 定义: 示例:登录功能的黑盒测试 适合使用黑盒测试的情况 几种常见的黑盒测试方法: 1. 等价类划分(Equivalence Partitioning) 2. 边界值分析(Boundary Value Analysis) …...
树控件QTreeWidget
树控件跟表格控件类似,也可以有多列,也可以只有1列,可以有多行,只不过每一行都是一个QTreeWidgetItem,每一行都是一个可以展开的树 常用属性和方法 显示和隐藏标题栏 树控件只有水平标题栏 //获取和设置标题栏的显…...
Python酷库之旅-第三方库Pandas(139)
目录 一、用法精讲 626、pandas.plotting.scatter_matrix方法 626-1、语法 626-2、参数 626-3、功能 626-4、返回值 626-5、说明 626-6、用法 626-6-1、数据准备 626-6-2、代码示例 626-6-3、结果输出 627、pandas.plotting.table方法 627-1、语法 627-2、参数 …...
昇思学习打卡营学习记录:CycleGAN壁画修复
按照提示,运行实训代码 进入实训平台:https://xihe.mindspore.cn/projects 选择“jupyter 在线编辑器” 启动“Ascend开发环境” :Ascend开发环境需要申请,大家可以申请试试看 启动开发环境后,在左边的文件夹中&am…...
南京大学《软件分析》李越, 谭添——1. 导论
导论 主要概念: soundcompletePL领域概述 动手学习 本节无 文章目录 导论1. PL(Programming Language) 程序设计语言1.1 程序设计语言的三大研究方向1.2 与静态分析相关方向的介绍与对比静态程序分析动态软件测试形式化(formal)语义验证(verification) 2. 静态分析:2.1莱斯…...
使用seata管理分布式事务
做应用开发时,要保证数据的一致性我们要对方法添加事务管理,最简单的处理方案是在方法上添加 Transactional 注解或者通过编程方式管理事务。但这种方案只适用于单数据源的关系型数据库,如果项目配置了多个数据源或者多个微服务的rpc调用&…...
浏览器指纹
引言 先看下 官网 给的定义。 WebAssembly (abbreviatedWasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server …...
W外链平台有什么优势?
W外链作为一种短网址服务,具备多项功能和技术优势,适用于多种场景,以下是其主要特点和优势: 短域名与高级设置:W外链提供了非常短的域名,这有助于提高用户体验,使其在社交媒体分享时更加便捷。…...
深入理解Spring Cache:加速应用性能的秘钥
一、什么是Spring Cache? Spring Cache是Spring框架中的一部分,它为应用提供了一种统一的缓存抽象,可以轻松集成各种缓存提供者(如Ehcache、Redis、Caffeine等)。通过使用Spring Cache,开发者可以在方法上…...
C语言入门基础题(力扣):完成旅途的最少时间(C语言版)
1.题目: 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间。 每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 …...
基于LORA的一主多从监测系统_0.96OLED
关联:0.96OLED hal硬件I2C LORA 在本项目中每个节点都使用oled来显示采集到的数据以及节点状态,OLED使用I2C接口与STM32连接,这个屏幕内部驱动IC为SSD1306,SSD1306作为从机地址为0x78 发送数据:起始…...
C#系统学习路线
分享一个C#程序员的成长学习路线规划,希望能够帮助到想从事C#开发的你。 我一直在想,初学者刚开始学习编程时应该学些什么?学习到什么程度才能找到工作?才能在项目中发现和解决Bug? 我不知道每位初学者在学习编程时是…...
UI开发:从实践到探索
UI开发:从实践到探索 参考博客文章:https://blog.jim-nielsen.com/2024/sanding-ui/ 在现代web开发中,用户界面(UI)的重要性不言而喻。一个优秀的UI不仅能提升用户体验,还能直接影响产品的成功。 UI开发…...
操作系统 | 学习笔记 | 王道 | 3.1 内存管理概念
3 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存可以存放数据,程序执行前需要先放到内存中才能被CPU处理—缓和cpu和磁盘之间的速度矛盾 内存管理的概念 虽然计算机技术飞速发展,内存容量也在不断扩大,但仍然不可能将所有…...
Unity射线之拾取物体
实现效果: 可以移动场景内物品放置到某个位置。通过射线检测,点击鼠标左键,移动物体,再点击左键放下物体。 效果: 移动物体 实现思路: 通过射线检测,将检测到的物体吸附到摄像机前的一个空物…...
Python的numpy库矩阵计算(数据分析)
一、创建矩阵 import numpy as np#创建矩阵anp.arange(15).reshape(3,5) bnp.arange(15,30).reshape(3,5) 使用arrange和reshape创建的二维数组就可以看成矩阵。 此时a和b存储的是: [[ 0 1 2 3 4] [ 5 6 7 8 9] [10 11 12 13 14]] [[15 16 17 18 19]…...
R语言的基本语句及基本规则
0x01 赋值语句 使用 “<-” 或 “” 进行赋值。例如: x <- 5 # 将数值 5 赋值给变量 x y 10 # 另一种赋值方式0x02 输出语句 使用 print() 函数输出内容。例如: print("Hello, R!") print(x)0x03 注释语句 任何在 #之后的内容在…...
网络受限情况下安装openpyxl模块提示缺少Jdcal,et_xmlfile
1.工作需要处理关于Excel文件内容的东西 2.用公司提供的openpyxl模块总是提示缺少jdcal文件,因为网络管控,又没办法直接使用命令下载,所以网上找了资源,下载好后上传到个人资源里了 资源路径 openpyxl jdcal et_xmlfile 以上模块来源于:Py…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...


