目录
一、File类
1.File类的作用
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
2.File类的构造
public File(String pathname)
public File(String parent, String child)
public File(File parent, String child)
注意:
1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
3.相对路径和绝对路径的概念
绝对路径:从盘符开始的路径,这是一个完整的路径。
相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
4.获取方法
public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :返回此File的路径名字符串。(只能获取文件的大小,对于文件夹来说大小是不确定的)
public String getName() :返回由此File表示的文件或目录的名称。
public long length() :返回由此File表示的文件的长度。
5.判断方法
public boolean exists() :此File表示的文件或目录是否实际存在。
public boolean isDirectory() :此File表示的是否为目录。
public boolean isFile() :此File表示的是否为文件。
在开发中必须先判断是否存在,在判断是否是文件夹或文件
6.创建删除方法
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
public boolean delete() :删除由此File表示的文件或目录。(文件夹里面有文件时无法删除)
public boolean mkdir() :创建由此File表示的目录。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
7.遍历目录的方法(*****)
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
二、递归
1.什么是递归?
在方法内部调用自己
2.目录搜索案例
public static void main(String[] args) {
File file = new File("F:/黑马程序员");
searchFile(file, "txt");
}
public static void searchFile(File file, String name) {
//参数非空判断
Objects.requireNonNull(file);
Objects.requireNonNull(name);
//方式1:匿名内部类
/*File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith("." + name)||pathname.isDirectory();
}
});*/
//方式2:Lanbda表达式
if (file.exists()) {
File[] files = file.listFiles((pathname) -> {
return pathname.getName().endsWith("." + name)
|| pathname.isDirectory();
});
//递归调用
for (File f : files) {
if (f.isDirectory()) {
searchFile(f, name);
} else {
//打印文件名
System.out.println(f.getName());
}
}
}
}
3.批量修改文件名案例
File file = new File("F:/黑马程序员/就业班/day08-File类、递归/文件重命名案例");
if(file.exists()){
File[] files = file.listFiles();
for (File file1 : files) {
String filename = file1.getName();
int i = filename.indexOf("_");
int y = filename.lastIndexOf("_");
filename = filename.substring(i + 1, i + 4) +
filename.substring(y + 1);
System.out.println(file1.renameTo(new File(file, filename)));
}
}
4.获取文件夹大小案例
描述:从键盘接收一个文件夹路径,获得该文件夹大小并输出到控制台。
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入文件夹路径");
String fileName = sc.next();
File f = new File(fileName);
System.out.println(getFileSize(f));
}
public static long getFileSize(File file) {
long length = 0;
Objects.requireNonNull(file);
if (file.exists()) {
File[] files = file.listFiles();
for (File file1 : files) {
if (file1.isDirectory()) {
length += getFileSize(file1);
} else {
length += file1.length();
}
}
return length;
} else {
return 0;
}
}
5.猴子吃桃子问题
描述:猴子吃桃子问题,猴子第一天摘下若干个桃子,当即吃了快一半,还不过瘾,又多吃了一个。
第二天又将仅剩下的桃子吃掉了一半,又多吃了一个。以后每天都吃了前一天剩下的一半多一个。
到第十天,只剩下一个桃子。试求第一天共摘了多少桃子? //1534
public static void main(String[] args) {
System.out.println(getNum(10));
}
public static int getNum(int n){
if(n==1){
return 1;
}else{
return (getNum(n-1)+1)*2;
}
}
6.斐波那契数列
描述:
用递归实现不死神兔
故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
在他的一部著作中提出了一个有趣的问题:假设一只刚出生的小兔一个月后就能长成大兔,
再过一个月(也就是第三个月)就能生下一只小兔,并且此后每个月都生一只小兔,没有发生死亡,
问:现有一只刚出生的兔子2年后(24个月)会有多少只兔子?
分析:
从第一个兔子开始,第1个月1只兔子,由于长到第三个月后每个月又生一只兔子,所以第2个月也是1只兔子,第3个月时可以生一只兔子,所以总数为2只,这时,其中有一只是以后每个月都可以生一只兔子的老兔子,另一只是一只新兔子,它只有在第三个月的时候才可以每个月生一只兔子;这样的话,第4个月的兔子总数为3只,…以此类推,从第1个月到第24个月的兔子总数分别为:1,1,2,3,5,8,13,21,34,55,89,144...
public static void main(String[] args) {
for (int i = 1; i <= 15; i++) {
System.out.println(getNum(i));
}
}
public static int getNum(int month){
if(month==1||month==2){
return 1;
}else{
return getNum(month-2)+getNum(month-1);
}
}