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

开发中需要长久保存的数据,可以保存在磁盘的文件中,即使断电后也不会丢失

  • Filejava.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)/21f(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);   // 你好

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

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

相关文章

oracle 基础知识之 多表查询

多表查询定义:当查询的数据并不是来源一个表时,需要使用多表连接操作完成查询。多表连接查询通过表之间的关联字段,一次查询出多个表的数据。多表查询包括了等值连接、左连接、右连接、完全连接。 1.等值连接 等值连接也称为简单连接&#xf…

服务器防火墙根据什么特征来过滤数据包?

防火墙是服务器安全防护的第一道屏障,它的主要作用是监控、过滤和控制进出服务器的数据流量,防止恶意攻击、非法访问和数据泄露。防火墙通过分析数据包的特定特征来决定是否允许、拒绝或限制数据的传输。 服务器防火墙的基本工作原理: 防火墙…

Prims region.Views 为null

原因: 导航未完成或异步问题 解决方式:使用回调确认导航完成后再操作视图 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…

软件安全性测试的重要性和常用工具介绍,软件测试服务公司推荐

在当今数字化快速发展的时代,软件已经成为各行各业不可或缺的一部分。然而,随着软件系统的复杂性增加,安全性问题也愈发突出,因此软件产品生产周期中安全测试必不可少。软件安全性测试是指对软件系统进行评估,以发现潜…

Redis项目:短信验证码登录

这是黑马的黑马点评项目,短信验证码的业务。一开始是使用session做的,后来重构,使用redis缓存来完成。 第一层拦截器: public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stri…

Docker下载,包含Win、Mac

介绍 Docker 是一种开源的容器化平台,通过操作系统级虚拟化技术实现应用的快速开发、部署和运行。以下从多个维度对 Docker 进行详细介绍: 一、Docker 的核心概念与功能 容器化技术 Docker 利用 Linux 内核的容器隔离技术(如 Cgroups 和 Nam…

使用 ESP8266 和 Android 应用程序实现基于 IOT 的语音控制家庭自动化

使用 ESP8266 实现基于 IOT 的语音控制家庭自动化 欢迎来到另一个令人兴奋的项目,我们将使用 Wi-Fi 模块构建一个语音控制ESP8266家庭自动化系统,您可以在其中通过语音通过 Android 应用程序从世界任何地方控制您的家用电器。是的,您只需使用语音命令即可打开或关闭负载(L…

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解 一、三者的区别与关系 1. 官方迭代过程为: CustomDialog 》 OpenCustomDialog 》 DialogHub 迭代过程表明,弹框的调用越来越便捷,与UI解耦&…

【C++】stack和queue的使用及模拟实现(含deque的简单介绍)

文章目录 前言一、deque的简单介绍1.引入deque的初衷2.deque的结构3.为什么选择deque作为stack和queue的底层默认容器 二、stack1.stack的介绍2.stack的使用3.stack的模拟实现 三、queue1.queue的介绍2.queue的使用3.queue的模拟实现 前言 一、deque的简单介绍(引入…

Leetcode 刷题笔记1 图论part01

图论的基础知识: 图的种类: 有向图(边有方向) 、 无向图(边无方向)、加权有向图(边有方向和权值) 度: 无向图中几条边连接该节点,该节点就有几度&#xff1…

《基于Workspace.java的Launcher3改造:HotSeat区域动态阻断文件夹生成机制》

1. 需求背景与技术挑战 在Android 13系统Launcher3定制化开发中,需实现禁止HotSeat区域创建文件夹的功能。原始逻辑中,当用户拖拽应用图标至HotSeat区域相邻图标时,会触发FolderIcon的实例化。本文将深入分析Launcher3的文件夹创建机制&…

重生之我在学Vue--第14天 Vue 3 国际化(i18n)实战指南

重生之我在学Vue–第14天 Vue 3 国际化(i18n)实战指南 文章目录 重生之我在学Vue--第14天 Vue 3 国际化(i18n)实战指南前言一、Vue I18n 核心配置1.1 基础环境搭建1.2 初始化配置1.3 全局挂载 二、多语言实现方案2.1 基础使用2.2 动态切换语言2.3 高级功能实现复数处理日期/货币…

开源PACS(dcm4che-arc-light)部署教程,源码方式

目录 文件清单下载地址安装概述OpenLDAP、Apache Directory StudioWildflydcm4che 安装部署MySQL源码编译dcm4cheedcm4chee-arc-light OpenLDAP安装ApacheDirectoryStudio安装配置WildFly服务器 部署完成 文件清单 下载地址 Apache directory studio - linkOpenLDAP - linkdcm…

java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比

在Java应用程序中,处理应用首选项(preferences)有多种方法,包括使用java.util.prefs.Preferences类、属性文件(如.properties文件)、XML文件和JSON文件。下面是每种方法的详细说明和代码示例,最…

工作记录 2017-02-04

工作记录 2017-02-04 序号 工作 相关人员 1 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、DataExport的设置中去掉了ListPayors,见DataExport\bin\dataexport.xml 2、“IPA/Group Name” 改为 “Insurance Name”。 3、修改了Payment Posted的E…

dataframe数据形式操作中的diff和shift函数区别与对比

问题分析 从错误日志中可以看到,代码在 report_services.py 的 gnss_monthly_report 函数中出现了 ValueError,具体错误信息是: ValueError: either both or neither of x and y should be given这个错误发生在以下代码行: rep…

C语言动态内存管理(下)

欢迎拜访:雾里看山-CSDN博客 本篇主题:C语言动态内存管理(下) 发布时间:2025.3.18 隶属专栏:C语言 目录 动态内存常见错误内存泄漏(Memory Leak)典型场景后果解决方案 悬挂指针(Dangling Pointe…

Vue:Vue2和Vue3创建项目的几种常用方式以及区别

前言 Vue.js 和 Element UI 都是用 JavaScript 编写的。 1、Vue.js 是一个渐进式 JavaScript 框架。2、Element UI 是基于 Vue.js 的组件库。3、JavaScript 是这两个项目的主要编程语言。 而Element Plus是基于TypeScript开发的。 一、Vue2 1、基于vuecli工具创建 vue2 …

机器人曲面跟踪Surface-Tracking

定义 机器人曲面跟踪(Surface-Tracking)是指机器人通过实时感知工件曲面的三维形貌,动态调整运动轨迹和位姿,以精确跟随曲面进行加工(如打磨、抛光、喷涂等)的技术。 力 - 位姿协同控制 力控模式&#xff…