12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)

文章目录
- File >> 存储数据的方案
- 1. 认识File
- 2. File操作
- 2.1 创建File对象
- 2.2 File操作
- 1)对文件对象的信息的操作
- 2)文件/文件夹的创建/删除
- 3)⭐⭐对文件夹的遍历
- 3. 方法递归
- 3.1 认识递归
- 3.2 递归算法及其执行流程
- 1) 案例:
- 2) 递归算法的三要素:
- 3) 🤔练习:猴子吃桃问题
- 3.3 ⭐递归实现文件搜索
- 4. 字符集
- 4.1 常见字符集介绍
- 4.2 字符集的编码、解码操作
- 1)编码
- 2)解码
File >> 存储数据的方案
1. 认识File
开发中需要长久保存的数据,可以保存在磁盘的文件中,即使断电后也不会丢失
File是java.io.包下的类,File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹),只能操作文件本身
2. File操作
2.1 创建File对象
File file = new File("文件/文件夹/绝对路径/相对路径");
// public File(String pathname):通过将给定的路径名字符串转换为表示绝对路径名字符串来创建一个新File实例。
// public File(String parent, String child):从父路径名字符串和子路径名字符串创建一个新File实例。
// public File(File parent, String child):从父目录和子路径名字符串创建一个新File实例。
// File f11 = new File("F:\\Pictures\\江晏.png"); 反斜杠的路径:双反斜杠
File f1 = new File("F:/Pictures/江无浪.png");
2.2 File操作
1)对文件对象的信息的操作
System.out.println(f1.getName()); // 文件名
System.out.println(f1.getParent()); // 父路径
System.out.println(f1.getPath()); // 路径System.out.println(f1.length()); // 字节个数
System.out.println(f1.lastModified()); // 最后修改时间
System.out.println(f1.isFile()); // 是否是文件
System.out.println(f1.isDirectory()); // 是否是文件夹// 可以使用相对路径定位文件对象
// 只要带有盘符的路径都称之为绝对路径
// 相对路径:不带盘符,默认是到你的idea工程下直接寻找文件的。一般用来找工程下的项目文件的
System.out.println(f1.getAbsolutePath()); // 绝对路径
2)文件/文件夹的创建/删除
// 3、创建对象代表不存在的文件路径\文件夹
File f2 = new File("F:/Users/Juzi/Pictures/江晏1.png");
System.out.println(f2.exists()); // 判断文件是否存在
System.out.println(f2.createNewFile()); // 创建文件// 4、创建对象代表不存在的文件夹
// mkdir():创建单级文件夹
File dir1 = new File("F:/Users/Juzi/Pictures/dir1");
System.out.println(dir1.mkdir());
// mkdirs():创建多级文件夹
File dir2 = new File("F:/Users/Juzi/Pictures/dir1/dir2/dir3");
System.out.println(dir2.mkdirs());// 5、创建File对象代表存在的文件,然后删除它
File f3 = new File("F:/Users/Juzi/Pictures/江晏.png");
System.out.println(f3.delete());// 6、创建File对象代表存在的文件夹,然后删除它
// 只能删除空文件夹
File dir3 = new File("F:/Users/Juzi/Pictures/dir1");
System.out.println(dir3.delete());
3)⭐⭐对文件夹的遍历

💡可以通过获取的文件对象数组是长度为0还是为null,来判断该文件夹是为空还是没有权限访问,从而采取措施提高代码的健壮性。
// 7、遍历文件夹的方法
// public String[] list():获取当前目录下的所有子项,以字符串数组的形式返回。
// public File[] listFiles():获取当前目录下的所有子项,以File数组的形式返回。
File names = new File("F:/Users/Juzi/Pictures");
String[] namelist = names.list();
for (String name : namelist){System.out.println(name);
}
// 获取的是文件对象,然后可以操作文件
File[] files = names.listFiles();
for (File file : files){System.out.println(file);
}
3. 方法递归
3.1 认识递归
- 一种算法
- 从形式上:方法调用自身的形式 >>> 递归
- 直接递归:方法自己调用自己
- 间接递归:方法调用其他方法,其他方法又回调方法自己
- 需注意的问题:
- 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误
public static void main(String[] args) {// 目标:认识递归的形式print(3);
}public static void print(int n) {if (n > 0) {print(n - 1); // 递归调用:自己调自己System.out.print(n + "\t");}
}

3.2 递归算法及其执行流程
1) 案例:
- 需求:计算n的阶乘
- 分析
- 公式:
f(n) = 1 * 2 * 3 * 4 * ...(n-1) * n; - 递归写法:
f(n) = f(n-1) * n
- 公式:
public static void main(String[] args) {// 目标:计算n的阶乘System.out.println(factorial(5)); // 120
}public static int factorial(int n) {if (n == 1) {return 1;}return n * factorial(n - 1);
}
- 递归调用的流程
先一层一层入栈,再一层一层出栈

2) 递归算法的三要素:
- 递归公式:
f(n) = f(n-1) * n - 递归的终结点:
f(1) - 递归的方向必须走向终结点
3) 🤔练习:猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘多少个桃子?
分析:
-
每天都是同一个事件:当天桃子数量的一半 + 1
-
递归公式:
f ( n + 1 ) = f ( n ) − f ( n ) / 2 − 1 → f ( n ) = 2 f ( n + 1 ) + 2 f(n+1) = f(n)-f(n)/2-1 \quad →f(n) = 2f(n+1) + 2 f(n+1)=f(n)−f(n)/2−1→f(n)=2f(n+1)+2 -
递归的终结点:
f(10) = 1 -
递归的方向必须走向终结点
public static void main(String[] args) {// 猴子吃桃System.out.println(peachCount(1)); // 1534// 第一天的桃子数量 peachCount(1)
}public static int peachCount(int day){if(day == 10){return 1;}return (peachCount(day + 1) + 1) * 2;
}

3.3 ⭐递归实现文件搜索
-
需求:从E:盘中,搜索 “ QQ.exe ” 文件,找出后输出其位置
-
分析:
- 先找出E:盘下的所有一级文件对象
- 遍历全部一级文件对象,判断是否是文件
- 是文件 → 判断是否是自己想要的
- 是文件夹,需要继续进入到该文件夹,重复上述过程
public static void main(String[] args) {// 目标:完成文件搜索// 1、定义一个方法,实现文件搜索功能。// 2、在main方法中调用该方法,并测试。File dirPath = new File("E:/");searchFile(dirPath, "QQ.exe");
}/*** 递归实现文件搜索* @param dirPath 搜索的目录路径* @param fileName 要搜索的文件名*/
public static void searchFile(File dirPath, String fileName){// 1、判断极端情况: 判断当前目录是否存在,并且是文件夹,并且不是文件// ① 当前目录是否有权限访问 || ② 当前目录是否存在 || ③ 当前目录是否是文件if(dirPath == null || !dirPath.exists() || dirPath.isFile()){System.out.println("搜索的文件不存在!");return;}// 2、获取目录下的所有一级文件或者文件夹对象File[] files = dirPath.listFiles();// 2.1 考虑极端情况:判断当前目录下是否存在一级文件对象,存在才可以遍历// files != null 》》》 当前目录有权限拿// files.length > 0 》》》 当前目录有一级文件对象if(files!=null && files.length>0){// 3、遍历一级文件对象,判断是文件还是文件夹for (File file : files){if(file.isFile()){// 4、判断文件名是否匹配if(file.getName().contains(fileName)){System.out.println("找到文件:" + file.getAbsoluteFile());}}else{// 5、递归搜索子文件夹searchFile(file, fileName);}}}
}
📓关于 if 条件语句中的判断 >>> 遍历文件的 listfiles() 方法中各返回值的明细
4. 字符集
4.1 常见字符集介绍
- 标准ASCII字符集
- 包含英文、符号等
- 使用1个字节(8位)存储一个字符,首位是0,总共可表示128个字符
- GBK(汉字内码扩展规范,国标)
- 汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成两个字节的形式存储
- GBK兼容了ASCII字符集
- 汉字的第一个字节的第一位必须是1
- Unicode字符集(统一码)
- 国际组织制定的,可以容纳世界上所有文字、符号的字符集
- UTF-8字符集:
- Unicode字符集的一种编码方案
- 采用可变长编码方案:前缀码
- 共四个长度区:1个字节(英文、数字),2个字节,3个字节(汉字),4个字节

可变长编码
4.2 字符集的编码、解码操作
⚠️字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码
⚠️英文、数字一般不会乱码,因为很多字符集兼容了ASCII码
1)编码
getBytes()方法:将字符串转换为字节数组
getBytes(String charsetName):指定编码方式,将字符串转换为字节数组
String str = "你好";byte[] bytes = str.getBytes(); // 默认使用UTF-8编码
System.out.println(bytes.length); // 6
System.out.println(Arrays.toString(bytes)); // [-28, -67, -96, -27, -91, -67]byte[] gbks = str.getBytes("GBK");
System.out.println(gbks.length); // 4
System.out.println(Arrays.toString(gbks)); // [-60, -29, -70, -61]
2)解码
String(byte[] bytes):默认使用UTF-8解码
String(byte[] bytes, String charsetName):指定编码方式,将字节数组解码为字符串
String str2 = new String(bytes);
System.out.println(str2); // 你好String str3 = new String(gbks, "GBK");
System.out.println(str3); // 你好
相关文章:
12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)
文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1)对文件对象的信息的操作2)文件/文件夹的创建/删除3)⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例:2…...
HTML应用指南:利用GET请求获取猫眼电影日票房信息——以哪吒2为例
2025年春节档期,国产动画电影《哪吒之魔童闹海》(以下简称《哪吒2》)以颠覆性的叙事风格与工业化制作水准震撼登场,不仅刷新了中国动画电影的票房纪录,更成为全球影史现象级作品。影片凭借春节档期的爆发式开局、持续5…...
荣耀手机卸载应用商店、快应用中心等系统自带的
1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…...
[AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南
在芯片验证中,回归测试(Regression Test)是确保设计稳定性的关键步骤。但随着设计复杂度增加,手动管理海量测试用例、分析日志和覆盖率数据变得异常耗时。本文将介绍如何利用持续集成(CI)工具Jenkins,结合EDA验证环境(如Cadence vManager),实现自动化测试与结果分析,…...
苍穹外卖学习笔记
整体概述 1).用户层 本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序 2).网关层 Nginx是一个服务器,主要用来作为Http服务器&…...
Spring常用注解汇总
1. IOC容器与Bean管理 注解说明示例Component通用注解,标记类为Spring Bean Component public class MyService { ... } Controller标记Web控制器(应用在MVC的控制层) Controller public class UserController { ... } Service标记业务逻辑层…...
深度强化学习中的深度神经网络优化策略:挑战与解决方案
I. 引言 深度强化学习(Deep Reinforcement Learning,DRL)结合了强化学习(Reinforcement Learning,RL)和深度学习(Deep Learning)的优点,使得智能体能够在复杂的环境中学…...
每日一题力扣2974.最小数字游戏c++
2974. 最小数字游戏 - 力扣(LeetCode) class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…...
软考中级-软件设计师 准备
软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值: 二、软考备考2.1、相关书籍2.2、推荐课程:B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考,一般是五月末和十一月的中旬 以下…...
EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代
在当今数字化时代,智能设备的普及和人们对实时通信需求的不断增长,推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势,在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…...
lua垃圾回收
lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空,会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…...
Lineageos 22.1(Android 15)实现负一屏
一、前言 方案是参考的这位大佬的,大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整,加入aidl引入,这样make之后就可以索引代码了 filegroup {name: "launcher-src"…...
《深度学习》——YOLOv3详解
文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3(You Only Look Once, version 3)是一种先进的实时目标检测算法,由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色,具有速度快、精…...
【设计模式】三十一、状态模式
系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式核心思想二、模式结构三、Java代码示例:订单状态管理1. 定义状态接口2. 实现具体状态类3. 上下文类(Context)4. 客户端调用5. 运行截图 四、状…...
vue 获取当前时间并自动刷新
新增需求,需要在大屏的右上角展示当前时间,并实时按秒刷新,通过通义千问搜索关键js代码后,整理出如下代码。 【效果图】 【HTML】 <div class"time-wrap">{{ formattedDateTime }}<span> {{ weekTime }}&…...
C 语 言 --- 扫 雷 游 戏(初 阶 版)
C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 💡个 人 主…...
WebDeveloper靶机详解
一、主机发现 arp-scan -l靶机ip为192.168.55.163 二、端口扫描、目录枚举、漏洞扫描、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.163发现并无特殊端口开放 扫描一下UDP端口 nmap -sU --min-rate 10000 -p- 192.168.55.163没有扫描到UDP端口 2.2目录枚…...
Cursor IDE 入门指南
什么是 Cursor? Cursor 是一款集成了 AI 功能的现代代码编辑器,基于 VSCode 开发,专为提高开发效率而设计。它内置强大的 AI 助手功能,能够理解代码、生成代码、解决问题,帮助开发者更快、更智能地完成编程任务。 基础功能 1.…...
来源于胡椒的亚甲二氧桥CYP450-文献精读119
Piper nigrum CYP719A37 Catalyzes the Decisive Methylenedioxy Bridge Formation in Piperine Biosynthesis 胡椒 (Piper nigrum) CYP719A37 催化胡椒碱生物合成中关键的亚甲二氧桥形成 摘要 胡椒 (Piper nigrum) 是世界上最受欢迎的香料之一。其主要辛辣成分胡椒碱 (piper…...
STM32八股【1】-----启动流程和startup文件理解
启动流程 知识点 MCU 上电复位。MSP从向量表第0个地址读取一个32位(2字节)的值并保存,该值为栈顶地址。PC计数器从第1个地址读取一个两字节的值并保存,该值为程序入口,一般是Reset_Handler。想了解FLASH地址映射可以…...
Docker与K8S是什么该怎么选?
用了很久的容器化,最近突然看到一个问题问: docker和K8S究竟有什么区别,到底该怎么选?我认真思考了一会,发现一时间还真说不明白,于是就研究了一段时间发布今天的博文! Docker vs Kubernetes&a…...
梦回杭州...
她对我说,烟雨中的西湖更别有情趣,我也怀着对‘人间天堂’的憧憬踏上了向往之旅。第一次亲密接触没有感觉中那么好,现在想起来是那时的人和心情都没能安静下来,去慢慢品味它的美。 六下杭州,亲历每一片风景,…...
NAT 实验:多私网环境下 NAPT、Easy IP 配置及 FTP 服务公网映射
NAT基本概念 定义:网络地址转换(Network Address Translation,NAT)是一种将私有(保留)地址转化为合法公网 IP 地址的转换技术,它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。作…...
SEED XSS 实验环境搭建步骤《精简版》
目录 1. 启动 SEED Ubuntu VM 2. 配置 /etc/hosts 3. 下载并解压 Labsetup.zip 4. 使用 Docker Compose 启动实验环境 5. 确保容器正常运行 6. 访问 Elgg Web 应用 7. 账户信息 8. 进入容器内部 9.实验环境搭建完成 🎉 10. 关闭实验 11.💡 重…...
YOLO数据集分割训练集、测试集和验证集
记录一下自己的分割代码。 注意: 这是在windows环境,请Linux的同学们注意。标签为txt,图像为jpg,其他的我没试过喔。 训练集、验证集、测试集(7:2:1) import os import shutil import random from tqdm…...
Debug-037-table列表勾选回显方案
效果展示: 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能: 在图1中的列表中有三行数据,当点击“更换设备”按钮时,打开抽屉显示el-table组件如图2所示,可以直接回显勾选…...
使用 libevent 构建高性能网络应用
使用 libevent 构建高性能网络应用 在现代网络编程中,高性能和可扩展性是开发者追求的核心目标。为了实现这一目标,许多开发者选择使用事件驱动库来管理 I/O 操作和事件处理。libevent 是一个轻量级、高性能的事件通知库,广泛应用于网络服务…...
人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)
最近终于把毕业大论文忙完了,众所周知硕士大论文需要有三个工作点,表情识别领域的第三个工作点一般是做一个表情识别系统出来,如下图所示。 这里分享一下这个表情识别系统: 采用 深度学习OpenCVPyQt5 构建,主要功能包…...
AtCoder - arc086_d Shift and Decrement分析与实现
分析与思路 可以把操作流程表示成下图 以进行四次除法操作为例: 这里有一个关键点:对于每个p_i (0< i <x-1) ,x是除法操作的次数,如果p_i>2,可以将2个p_i的减法操作去掉,在p_(i1)中增加一个减法…...
学习111
项目名称项目简介主要功能技术原理GitHub地址browser-use智能浏览器工具,让AI像人类一样操作浏览器,实现网页自动化网页浏览与操作、多标签页管理、视觉识别与内容提取、操作记录与重复执行、自定义动作支持、主流LLM模型支持为大语言模型服务的创新Pyth…...
