文章目录
学习日记(File 类、方法递归案例、字符集)
一、File 类
- File 类代表操作系统的文件对象(文件、文件夹)。
- 提供了如定位文件本身的信息、删除文件、创建文件(文件夹)等功能。
- 注意 File 类不能读写文件内容。
1. 创建 File 对象
- 路径的三种写法。
- 路径分为绝对路径(从盘符开始)和相对路径(从模块开始)。
- 路径可以是文件的路径,也可以是文件夹的路径。
2. 常用 API
包括获取文件信息的 API、创建和删除文件的 API 以及遍历文件夹 API 。
(1)获取文件信息的 API
方法名 | 说明 |
---|---|
public String getAbsolutePath() | 获取绝对路径 |
public String getPath() | 获取创建 File 对象时使用的路径 |
public String getName() | 获取文件的名称,带后缀 |
public long length() | 获取文件的大小,字节大小,返回值类型为 long |
public boolean isFile() | 判断文件是否是文件 |
public boolean isDirectory() | 判断文件是否是文件夹 |
public long lastModified() | 获取文件的最后修改时间 |
public boolean exists() | 判断文件是否存在 |
示例
运行结果
(2)创建和删除文件的 API
方法名 | 说明 |
---|---|
public boolean createNewFile() throws IOException | 创建新文件,返回值类型为 boolean |
public boolean mkdir() | 创建一级目录,返回值类型为 boolean |
public boolean mkdirs() | 创建多级目录,返回值类型为 boolean |
public boolean delete() | 删除文件或空文件夹,返回值类型为 boolean |
注意:delete 方法直接删除,不走回收站。
示例
结果
(3)遍历文件夹 API
方法名 | 说明 |
---|---|
public File[] listFiles() | 获取当前目录下所有的一级文件对象到一个文件对象数组中去返回 |
注意:
- 当调用者(文件路径)不存在时,返回 null;
- 当调用者是一个文件时,返回 null;
- 当调用者是一个空文件夹时,返回一个长度为 0 的数组;
- 当调用者是一个有内容的文件夹时,将里面所有的(一级)文件和文件夹的路径放在 File 数组中返回;
- 当调用者是一个有隐藏文件的文件夹时,将里面所有的文件和文件夹的路径放在 File 数组中返回,包含隐藏内容;
- 当调用者是一个需要权限才能进入的文件夹时,返回 null。
3. 文件搜索
需求:文件搜索,从 E 盘中,找到某个文件名称,如:
WeChat.exe
,并输出绝对路径。
分析:
- 先定位出一级对象;
- 遍历全部一级对象,判断是否是文件;
- 如果是文件,判断是否是自己想要的;如果是文件夹,则需要继续递归重复上述过程。
package com.residue.File;
import java.io.File;
public class FileDemo06 {
public static void main(String[] args) {
//需求:文件搜索,从 E 盘中,找到某个文件名称,如:`WeChat.exe`,并输出绝对路径。
searchFile(new File("E:\\"), "WeChat.exe");
}
public static void searchFile(File file, String name) {
//判断文件是否为 null
if (file != null) {
//将一级目录文件存放到 File 数组中
File[] files = file.listFiles();
//如果 file 是一个文件,则 files 为 null;如果 file 是一个空文件夹时,
//则 files 的长度为 0,排除上面两种情况
if (files != null && files.length > 0) {
//此时 file 是一个文件夹,遍历文件夹
for (File f : files) {
//如果 f 是一个文件,判断是否是目标文件
if (f.isFile() && f.getName().contains(name)) {
System.out.println("文件已找到!文件的路径为:" + f.getAbsolutePath());
//启动!
try {
Runtime r = Runtime.getRuntime();
r.exec(f.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
} else {
//如果是文件夹,方法递归
searchFile(f, name);
}
}
} else if (file.isFile() && file.getName().contains(name)) {
System.out.println("文件已找到!文件的路径为:" + file.getAbsolutePath());
}
} else {
System.out.println("输入的不是文件!");
}
}
}
二、方法递归
递归要素:递归头(终结点)、递归体(递推公式)、递归的方向必须走向终结点。
1. 规律化递归
需求 1:计算 1-n 的阶乘。
需求 2:计算 1-n 的和。
需求 3:猴子吃桃子,第一天摘了若干个桃子,第二天吃了一半多一个,第三天又吃了第二天剩余的一半多一个,到第十天的时候发现桃子只有 1 个了,求原先摘了多少个桃子。
2. 非规律化递归
- 文件搜索:见 File 类内容 3。
- 啤酒问题:
需求:啤酒 2 元 1 瓶,4 个盖子可以换 1 瓶,2 个空瓶可以换 1 瓶,请问 10 元可以喝多少瓶啤酒,剩余多少空瓶和盖子。
package com.residue.recursion;
public class RecursionDemo04 {
public static int allBeer = 0; //总共喝了的啤酒
public static int lastBottle = 0; //剩余的瓶子
public static int lastCap = 0; //剩余的盖子
public static void main(String[] args) {
//需求:啤酒 2 元 1 瓶,4 个盖子可以换 1 瓶,2 个空瓶可以换 1 瓶,请问 10 元可以喝多少瓶啤酒,剩余多少空瓶和盖子。
/*
4 个盖子可以换 1 瓶:4 个盖子 2 元
2 个空瓶可以换 1 瓶:2 个空瓶 2 元
*/
money(10);
System.out.println(allBeer);
System.out.println(lastBottle);
System.out.println(lastCap);
}
public static void money(int x) {
//计算用钱一次可以最多买多少瓶啤酒
allBeer = allBeer + x / 2;
lastBottle = lastBottle + x / 2;
lastCap = lastCap + x / 2;
int mon = 0;
if (lastBottle >= 2) {
//开始用空瓶换啤酒
mon += (lastBottle / 2) * 2; //算相当于多少钱,2 个空瓶相当于 1 瓶,相当于 2 元
lastBottle = lastBottle % 2; //计算换完啤酒后(还没喝),剩余的瓶子
}
if (lastCap >= 4) {
mon += (lastCap / 4) * 2;
lastCap = lastCap % 4;
}
if (mon >= 2) {
money(mon);
}
}
}
三、字符集
1. 概述
字符集:计算机可以给人类字符进行编号存储,这套编号规则就是字符集。
常见的字符集有:ASCII 字符集、GBK 字符集、Unicode 字符集。
字符串常见的字符底层组成:
- 英文和数字在任何国家的字符集都占 1 个字节。
- GBK 字符集中一个中文字符占 2 个字节。
- UTF-8 编码中一个中文一般占 3 个字节。
- 编码前和编码后的字符集必须一致,否则会出现中文字符乱码。
- 英文和数字在任何国家的编码中都不会乱码,因为都兼容 ASCII 码表。
2. 字符集的编码、解码操作
编码(字符串 -> 字节数组)的方法(调用字符串的方法):
-
默认:
byte[] bytes1 = str.getBytes();
-
指定:
byte[] bytes2 = str.getBytes("GBK");
解码(字节数组 -> 字符串)的方法(使用构造器):
- 默认:
String result1 = new String(bytes1);
- 指定:
String result2 = new String(bytes2, "GBK");
注意:编码前和编码后的字符集必须一致,否则会出现中文字符乱码。
注意:
- 当文件路径不存在或者文件是文件夹时,此时调用 length 方法结果为 0。文件不存在,输出不是 null 。
- 字符串和字节数组的相互转化用上面编解码的方法,单个字符与字节的相互转化用类型转换。