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

news2025/3/23 2:49:04

在这里插入图片描述

文章目录

    • 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.coloradmin.cn/o/2319902.html

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

相关文章

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 这边是…

苍穹外卖学习笔记

整体概述 1).用户层 本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序 2).网关层 Nginx是一个服务器,主要用来作为Http服务器&…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; 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、题型和分值&#xff1a; 二、软考备考2.1、相关书籍2.2、推荐课程&#xff1a;B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考&#xff0c;一般是五月末和十一月的中旬 以下…

EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代

在当今数字化时代&#xff0c;智能设备的普及和人们对实时通信需求的不断增长&#xff0c;推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势&#xff0c;在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…

Lineageos 22.1(Android 15)实现负一屏

一、前言 方案是参考的这位大佬的&#xff0c;大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整&#xff0c;加入aidl引入&#xff0c;这样make之后就可以索引代码了 filegroup {name: "launcher-src"…

《深度学习》——YOLOv3详解

文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3&#xff08;You Only Look Once, version 3&#xff09;是一种先进的实时目标检测算法&#xff0c;由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色&#xff0c;具有速度快、精…

【设计模式】三十一、状态模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式核心思想二、模式结构三、Java代码示例&#xff1a;订单状态管理1. 定义状态接口2. 实现具体状态类3. 上下文类&#xff08;Context&#xff09;4. 客户端调用5. 运行截图 四、状…

vue 获取当前时间并自动刷新

新增需求&#xff0c;需要在大屏的右上角展示当前时间&#xff0c;并实时按秒刷新&#xff0c;通过通义千问搜索关键js代码后&#xff0c;整理出如下代码。 【效果图】 【HTML】 <div class"time-wrap">{{ formattedDateTime }}<span> {{ weekTime }}&…

C 语 言 --- 扫 雷 游 戏(初 阶 版)

C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 &#x1f4bb;作 者 简 介&#xff1a;曾 与 你 一 样 迷 茫&#xff0c;现 以 经 验 助 你 入 门 C 语 言 &#x1f4a1;个 人 主…

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目录枚…

来源于胡椒的亚甲二氧桥CYP450-文献精读119

Piper nigrum CYP719A37 Catalyzes the Decisive Methylenedioxy Bridge Formation in Piperine Biosynthesis 胡椒 (Piper nigrum) CYP719A37 催化胡椒碱生物合成中关键的亚甲二氧桥形成 摘要 胡椒 (Piper nigrum) 是世界上最受欢迎的香料之一。其主要辛辣成分胡椒碱 (piper…

梦回杭州...

她对我说&#xff0c;烟雨中的西湖更别有情趣&#xff0c;我也怀着对‘人间天堂’的憧憬踏上了向往之旅。第一次亲密接触没有感觉中那么好&#xff0c;现在想起来是那时的人和心情都没能安静下来&#xff0c;去慢慢品味它的美。 六下杭州&#xff0c;亲历每一片风景&#xff0c…

NAT 实验:多私网环境下 NAPT、Easy IP 配置及 FTP 服务公网映射

NAT基本概念 定义&#xff1a;网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是一种将私有&#xff08;保留&#xff09;地址转化为合法公网 IP 地址的转换技术&#xff0c;它被广泛应用于各种类型 Internet 接入方式和各种类型的网络中。作…

YOLO数据集分割训练集、测试集和验证集

记录一下自己的分割代码。 注意&#xff1a; 这是在windows环境&#xff0c;请Linux的同学们注意。标签为txt&#xff0c;图像为jpg&#xff0c;其他的我没试过喔。 训练集、验证集、测试集&#xff08;7:2:1&#xff09; import os import shutil import random from tqdm…

Debug-037-table列表勾选回显方案

效果展示&#xff1a; 图1 图2 最近实现一个支持勾选的el-table可以回显之前勾选项的功能。实现了一个“编辑”的功能&#xff1a; 在图1中的列表中有三行数据&#xff0c;当点击“更换设备”按钮时&#xff0c;打开抽屉显示el-table组件如图2所示&#xff0c;可以直接回显勾选…

人脸表情识别系统分享(基于深度学习+OpenCV+PyQt5)

最近终于把毕业大论文忙完了&#xff0c;众所周知硕士大论文需要有三个工作点&#xff0c;表情识别领域的第三个工作点一般是做一个表情识别系统出来&#xff0c;如下图所示。 这里分享一下这个表情识别系统&#xff1a; 采用 深度学习OpenCVPyQt5 构建&#xff0c;主要功能包…

AtCoder - arc086_d Shift and Decrement分析与实现

分析与思路 可以把操作流程表示成下图 以进行四次除法操作为例&#xff1a; 这里有一个关键点&#xff1a;对于每个p_i (0< i <x-1) &#xff0c;x是除法操作的次数&#xff0c;如果p_i>2&#xff0c;可以将2个p_i的减法操作去掉&#xff0c;在p_(i1)中增加一个减法…

tcping 命令的使用,ping IP 和端口

1. ‌Windows系统安装‌ ‌下载tcping工具‌&#xff1a;根据系统位数&#xff08;32位或64位&#xff09;下载对应的tcping.exe文件。‌安装步骤‌&#xff1a; 将下载的tcping.exe文件复制到C:\Windows\System32目录下。如果下载的是64位版本&#xff0c;需将文件名改为tcpi…