目录
1.File类
1.1File类概述和构造方法【应用】
1.2File类创建功能【应用】
1.3File类判断和获取功能【应用】
1.4File类删除功能【应用】
2.递归
2.1递归【应用】
2.2递归求阶乘【应用】
2.3递归遍历目录【应用】
1.File类
1.1File类概述和构造方法【应用】
-
File类介绍
-
它是文件和目录路径名的抽象表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
-
File类的构造方法
方法名 说明 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例 File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例
-
示例代码
package com.B.IOStream_14;
import java.io.File;
//1 File类概述和构造方法
public class File01 {
public static void main(String[] args) {
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("E:\JavaDemo\java.txt");
System.out.println(f1);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("E:\JavaDemo", "java.txt");
System.out.println(f2);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("E:\JavaDemo");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
}
}
E:JavaDemojava.txt
E:JavaDemojava.txt
E:JavaDemojava.txt
进程已结束,退出代码 0
1.2File类创建功能【应用】
-
方法分类
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
-
示例代码
package com.B.IOStream_14.FileDemo;
import java.io.File;
import java.io.IOException;
//2 File类创建功能
public class File02 {
public static void main(String[] args) throws IOException {
//需求1:我要在E:JavaDemo目录下创建一个文件java.txt
File f1 = new File("E:\JavaDemo\java.txt");
System.out.println(f1.createNewFile());
// Exception in thread "main" java.io.IOException: 系统找不到指定的路径。
// 因为根本没有JavaDemo这个目录,但是后期用到,所以我建一个后结果为 //true
// 再次运行,因为已经创建成功了,所以会返回 false
System.out.println(f1.createNewFile());//false
System.out.println("--------");
//需求2:我要在E:\JavaDemo目录下创建一个目录Demo01
File f2 = new File("E:\JavaDemo\Demo01");
System.out.println(f2.mkdir());//true 创建成功
System.out.println("--------");
//需求3:我要在E:\JavaDemo目录下创建一个多级目录Demo02\HTML
File f3 = new File("E:\JavaDemo\Demo02\HTML");
System.out.println(f3.mkdirs());//true 创建成功
System.out.println("--------");
//需求4:我要在E:\JavaDemo目录下创建一个文件javase.txt
File f4 = new File("E:\JavaDemo\javase.txt");
System.out.println(f4.createNewFile());//true 创建成功
}
}
创建成功:
1.3File类判断和获取功能【应用】
-
判断功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在
-
获取功能
方法名 说明 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或目录的名称 public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
File类介绍
-
它是文件和目录路径名的抽象表示
-
文件和目录是可以通过File封装成对象的
-
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
File类的构造方法
| 方法名 | 说明 |
|---|---|
| File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 |
| File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例 |
| File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例 |
示例代码
package com.B.IOStream_14;
import java.io.File;
//1 File类概述和构造方法
public class File01 {
public static void main(String[] args) {
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("E:\JavaDemo\java.txt");
System.out.println(f1);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("E:\JavaDemo", "java.txt");
System.out.println(f2);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("E:\JavaDemo");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
// E:JavaDemojava.txt只有一个路径名,没有实际存在
}
}
E:JavaDemojava.txt E:JavaDemojava.txt E:JavaDemojava.txt 进程已结束,退出代码 0
-
方法分类
方法名 说明 public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 public boolean mkdir() 创建由此抽象路径名命名的目录 public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 -
示例代码
package com.B.IOStream_14.FileDemo; import java.io.File; import java.io.IOException; //2 File类创建功能 public class File02 { public static void main(String[] args) throws IOException { //需求1:我要在E:JavaDemo目录下创建一个文件java.txt File f1 = new File("E:\JavaDemo\java.txt"); System.out.println(f1.createNewFile()); // Exception in thread "main" java.io.IOException: 系统找不到指定的路径。 // 因为根本没有JavaDemo这个目录,但是后期用到,所以我建一个后结果为 //true // 再次运行,因为已经创建成功了,所以会返回 false System.out.println(f1.createNewFile());//false System.out.println("--------"); //需求2:我要在E:\JavaDemo目录下创建一个目录Demo01 File f2 = new File("E:\JavaDemo\Demo01"); System.out.println(f2.mkdir());//true 创建成功 System.out.println("--------"); //需求3:我要在E:\JavaDemo目录下创建一个多级目录Demo02\HTML File f3 = new File("E:\JavaDemo\Demo02\HTML"); System.out.println(f3.mkdirs());//true 创建成功 System.out.println("--------"); //需求4:我要在E:\JavaDemo目录下创建一个文件javase.txt File f4 = new File("E:\JavaDemo\javase.txt"); System.out.println(f4.createNewFile());//true 创建成功 } }创建成功:
1.3File类判断和获取功能【应用】
-
判断功能
方法名 说明 public boolean isDirectory() 测试此抽象路径名表示的File是否为目录 public boolean isFile() 测试此抽象路径名表示的File是否为文件 public boolean exists() 测试此抽象路径名表示的File是否存在
-
获取功能
方法名 说明 public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串 public String getPath() 将此抽象路径名转换为路径名字符串 public String getName() 返回由此抽象路径名表示的文件或目录的名称 public String[] list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 public File[] listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
判断功能
| 方法名 | 说明 |
|---|---|
| public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
| public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
| public boolean exists() | 测试此抽象路径名表示的File是否存在 |
获取功能
| 方法名 | 说明 |
|---|---|
| public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
| public String getPath() | 将此抽象路径名转换为路径名字符串 |
| public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
| public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
| public File[] listFiles() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
示例代码
package com.B.IOStream_14.FileDemo;
import java.io.File;
//3 File类判断和获取功能
public class File03 {
public static void main(String[] args) {
//创建一个File对象
File f = new File("java.txt");//需要提前创建好java.txt文件
// E:IdeaProjectsfirstProjectjava.txt
// public boolean isDirectory():测试此抽象路径名表示的File是否为目录
// public boolean isFile():测试此抽象路径名表示的File是否为文件
// public boolean exists():测试此抽象路径名表示的File是否存在
System.out.println(f.isDirectory());//false 不是目录
System.out.println(f.isFile());//true 是文件
System.out.println(f.exists());//true 存在
// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
// public String getPath():将此抽象路径名转换为路径名字符串
// public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f.getAbsolutePath());//E:IdeaProjectsfirstProjectjava.txt
System.out.println(f.getPath());//java.txt
System.out.println(f.getName());//java.txt
System.out.println("--------");
// public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
File f2 = new File("E:\JavaDemo"); //需要新建一个目录
String[] strArray = f2.list(); //目录内的文件和目录的名称以字符串数组模式遍历输出
for(String str : strArray) {
System.out.println(str);
}
System.out.println("--------");
//Demo01
//Demo02
//java.txt
//javase.txt
//--------
File[] fileArray = f2.listFiles();
for(File file : fileArray) {
// System.out.println(file); //输出的是绝对路径
// System.out.println(file.getName()); //获取所有目录中的文件和目录的名称字符串数组
if(file.isFile()) { //如果是文件,则输出
System.out.println(file.getName());
}
}
//输出文件
//java.txt
//javase.txt
}
}
false true true E:IdeaProjectsfirstProjectjava.txt java.txt java.txt -------- Demo01 Demo02 java.txt javase.txt -------- java.txt javase.txt 进程已结束,退出代码 0
1.4File类删除功能【应用】
-
方法分类
方法名 说明 public boolean delete() 删除由此抽象路径名表示的文件或目录
- 绝对路径和相对路径的区别
方法分类
| 方法名 | 说明 |
|---|---|
| public boolean delete() | 删除由此抽象路径名表示的文件或目录 |
绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如: E:\itcastljava.txt
- 相对路径:必须使用取自其他路径名的信息进行解释。例: myFileyjava.txt
- 删除目录时的注意事项:
如果一个目录中有内容(目录,文件),不能直接删除。应该先删除目录中的内容,最后才能删除目录
-
示例代码
package com.B.IOStream_14.FileDemo; import java.io.File; import java.io.IOException; //4 File类删除功能 public class File04 { public static void main(String[] args) throws IOException { //需求1:在当前模块目录下创建javase2.txt文件 File f1 = new File("E:\JavaDemo\javase2.txt"); System.out.println(f1.createNewFile()); //需求2:删除当前模块目录下的javase2.txt文件 System.out.println(f1.delete()); System.out.println("--------"); //需求3:在当前模块目录下创建itcast目录 File f2 = new File("E:\IdeaProjects\firstProject\itcast"); System.out.println(f2.mkdir()); //需求4:删除当前模块目录下的itcast目录 System.out.println(f2.delete()); System.out.println("--------"); //需求5:在当前模块下创建一个目录itcast,然后在该目录下创建一个文件java.txt File f3 = new File("E:\IdeaProjects\firstProject\itcast"); System.out.println(f3.mkdir()); //创建时先创建目录再创建文件 File f4 = new File("E:\IdeaProjects\firstProject\itcast\java.txt"); System.out.println(f4.createNewFile()); //创建时先创建目录再创建文件 //需求6:删除当前模块下的目录itcast //删除目录时的注意事项: //如果一个目录中有内容(目录,文件),不能直接删除。应该先删除目录中的内容,最后才能删除目录 System.out.println(f4.delete()); //先删除目录中的内容 System.out.println(f3.delete()); //最后才能删除目录 } } -
需求1:在当前模块目录下创建javase2.txt文件
需求3:在当前模块目录下创建itcast目录
2.递归
2.1递归【应用】
-
递归的介绍
-
以编程的角度来看,递归指的是方法定义中调用方法本身的现象
-
递归的介绍
-
以编程的角度来看,递归指的是方法定义中调用方法本身的现象
-
递归解决问题思路:
-
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
-
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
递归解决问题要找到两个内容:
递归出口:否则会出现内存溢出
递归规则:与原问题相似的规模较小的问题
-
递归的基本使用
-
出现的问题:
//求第20个月兔子对数 // System.out.println(arr[20]); // ArrayIndexOutOfBoundsException抛出以表示使用非法索引访问数组。 索引为负数或大于或等于数组的大小。 //数组从1到20一共20个,在for循环中,索引只能取到0-19
改正以后:
System.out.println("第20个月兔子对数为:"+arr[19]);
//在数组中,第20个月索引为19,上面报错也是因为索引使用错误
代码:
package com.B.IOStream_14.FileDemo;
//不死神兔的递归解决
public class File05 {
public static void main(String[] args) {
//每月兔子对数:1,1,2,3,5,8,……
//通过回顾可以知道,兔子对数在第一和第二个月都为1,之后的每一个月兔子对数都为前两个月兔子对数之和,
//那么第n个月的兔子对数为{(n-2)+(n-1)},所以有循环
// 创建数组存储兔子对数
int []arr = new int[20];
// 定义第1,2个月兔子数量(固定的)
arr[0]=1;
arr[1]=1;
// 循环
for (int i=2; i
输出结果:
-
递归的注意事项
-
递归一定要有出口。否则内存溢出
-
递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
-
- 递归可能会出现的异常:
ArrayIndexOutOfBoundsException抛出以表示使用非法索引访问数组。 索引为负数或大于或等于数组的大小。
StackOverfLowError:当堆栈溢出发生时抛出一个应用程序递归太深(记得写出口)
2.2递归求阶乘【应用】
-
案例需求
用递归求5的阶乘,并把结果在控制台输出
-
思路:
1定义一个方法,用于递归求阶乘,
2参数为一个int类型的变量在方法内部判断该变量的值是否是1
是:返回1
不是:返回n*(n-1)!
3调用方法
4输出结果
-
-
代码实现
package com.B.IOStream_14.FileDemo;
//递归求阶乘
public class File06 {
public static void main(String[] args) {
//2.调用方法
int result = factorial(5);//i是多少就是求多少的阶乘
//3.输出结果
System.out.println("该值的阶乘为:"+result);
}
//1.定义一个方法,用于递归求阶乘,参数为一个int类型的变量
public static int factorial(int i) {
//在方法内部判断该变量的值是否是1
if (i == 1) {
//是:返回1
return 1; //1 的阶乘还是1
} else {
//不是:返回n*(n-1)!
return i * factorial(i - 1);
}
}
}
2.3递归遍历目录【应用】
-
案例需求
给定一个路径(E:itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台
-
思路:
案例需求
用递归求5的阶乘,并把结果在控制台输出
思路:
1定义一个方法,用于递归求阶乘,
2参数为一个int类型的变量在方法内部判断该变量的值是否是1
是:返回1
不是:返回n*(n-1)!
3调用方法
4输出结果
代码实现
package com.B.IOStream_14.FileDemo;
//递归求阶乘
public class File06 {
public static void main(String[] args) {
//2.调用方法
int result = factorial(5);//i是多少就是求多少的阶乘
//3.输出结果
System.out.println("该值的阶乘为:"+result);
}
//1.定义一个方法,用于递归求阶乘,参数为一个int类型的变量
public static int factorial(int i) {
//在方法内部判断该变量的值是否是1
if (i == 1) {
//是:返回1
return 1; //1 的阶乘还是1
} else {
//不是:返回n*(n-1)!
return i * factorial(i - 1);
}
}
}
-
案例需求
给定一个路径(E:itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台
-
思路:
1根据给定的路径创建一个File对象
2定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
3获取给定的File目录下所有的文件或者目录的File数组
4遍历该File数组,得到每一个File对象
5判断该File对象是否是目录
是:递归调用
不是:获取绝对路径输出在控制台
6调用方法
-
代码实现
package com.B.IOStream_14.FileDemo; import java.io.File; //递归遍历目录 public class File07 { public static void main(String[] args) { //根据给定的路径创建一个File对象 File srcFile = new File("E:\JavaDemo"); //调用方法 getAllFilePath(srcFile); } //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象 public static void getAllFilePath(File srcFile) { //获取给定的File目录下所有的文件或者目录的File数组 File[] fileArray = srcFile.listFiles(); //遍历该File数组,得到每一个File对象 if(fileArray != null) { //增加判断语句——非空则进入下一步,提高健壮性 for(File file : fileArray) { //判断该File对象是否是目录 if(file.isDirectory()) { //是:递归调用 getAllFilePath(file); } else { //不是:获取绝对路径输出在控制台 System.out.println(file.getAbsolutePath()); } } } } }



