1.File类
1.1File类概述和构造方法
File类介绍
- 它是文件和目录路径名的抽象表示
- 文件和目录是可以通过File封装成对象的
- 对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
File类的构造方法
方法名 | 说明 |
---|---|
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例 |
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例 |
示例代码
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("E:\\itcast\\java.txt");
System.out.println(f1);
//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("E:\\itcast","java.txt");
System.out.println(f2);
//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
File f3 = new File("E:\\itcast");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
1.2File类创建功能
方法分类
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
public boolean mkdir() | 创建由此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录 |
//public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
File f1 = new File("E:\\itcast\\java.txt");
System.out.println(f1.createNewFile());
//public boolean mkdir()创建由此抽象路径名命名的目录
File f2 = new File("E:\\itcast\\JavaSE");
System.out.println(f2.mkdir());
//public boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
File f3 = new File("E:\\itcast\\JavaWEB\\HTML");
System.out.println(f3.mkdirs());
1.3File类判断和获取功能
判断功能
方法名 | 说明 |
---|---|
public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
public boolean isFile() | 测试此抽象路径名表示的File是否为文件 |
public boolean exists() | 测试此抽象路径名表示的File是否存在 |
// 创建一个File对象
File f = new File("myFile\\java.txt");
// public boolean isDirectory():测试此抽象路径名表示的File是否为目录
// public boolean isFile():测试此抽象路径名表示的File是否为文件
// public boolean exists():测试此抽象路径名表示的File是否存在
System.out.println(f.isDirectory());
System.out.println(f.isFile());
System.out.println(f.exists());
获取功能
方法名 | 说明 |
---|---|
public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
public File[] listFiles() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 |
// public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
// public String getPath():将此抽象路径名转换为路径名字符串
// public String getName():返回由此抽象路径名表示的文件或目录的名称
System.out.println(f.getAbsolutePath());
System.out.println(f.getPath());
System.out.println(f.getName());
// public String[] list():返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
File f2 = new File("E:\\itcast");
String[] strArray = f2.list();
for(String str : strArray) {
System.out.println(str);
}
// public File[] listFiles():返回此抽象路径名表示的目录中的文件和目录的File对象数组
File[] fileArray = f2.listFiles();
for(File file : fileArray) {
if(file.isFile()) {
System.out.println(file.getName());
}
}
1.4File类删除功能
public boolean delete():删除由此抽象路径名表示的文件或目录
注意事项
- 如果一个目录中油内容(目录,文件),不能直接删除,先删除内容,最后才能删除目录
绝对路径和相对路径的区别
-
绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
-
相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt
2.递归
2.1递归的介绍
递归的介绍
- 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
范例:
回顾不死神兔问题,求第20个月兔子的对数
每个月的兔子对数:1,1,2,3,5,8,…
递归解决问题,首先就是要定义一个方法:
定义一个方法f(n):表示第n个月的兔子对数
那么,第n-1个月的兔子对数该如何表示呢?f(n-1)
同理,第n-2个月的兔子对数该如何表示呢?f(n-2)
public static int f(int n) {
if(n==1 || n==2) {
return 1;
} else {
return f(n - 1) + f(n - 2);
}
}
当报错StackOverflowError时:当堆栈溢出发生时抛出一个应用程序递归太深
递归的注意事项
- 递归一定要有出口。否则内存溢出
- 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
2.2递归遍历目录
//根据给定的路径创建一个File对象
File srcFile = new File("E:\\itheima");
//调用方法
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());
}
}
}
}
File类和递归练习
1.判断指定目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
public static void set(File file){
File[] f = file.listFiles();
if (f!=null){
for (File fil:f){
//endsWith():测试此字符串是否以指定的后缀结尾。
if (fil.getName().endsWith(".jpg")){
System.out.println(fil.getName());
}
if (fil.isDirectory()){
set(fil);
}
}
}
}
public static void main(String[] args) {
File file = new File("C:\\Users\\Whoareyou\\Desktop\\打字");
set(file);
2.遍历指定目录所有文件名称,包括子文件目录中的文件
File f = new File("D:\\JavaSE\\test");
getAll(f);
}
public static void getAll(File file) {
File[] fil = file.listFiles();
for (File f : fil) {
// System.out.println(f);
if (f.isFile()) {
System.out.println(f.getName());
}
if (f.isDirectory()) {
getAll(f);
}
}
}
3.操作D盘下的my.txt文件
- 判断my.txt文件是否存在
- 若存在则删除;若不存在则创建
File my=new File("my.txt");
if (my.exists()){
my.delete();
System.out.println("zai");
}else {
my.createNewFile();
System.out.println("bu");
}
4.File类的作用是什么?它是一种流吗?
File类是文件和目录路径名的抽象表示,用于文件和目录的创建、文件的查找和文件的删除等;
File类不是流,数据在设备间的传输称为流;
5.使用File类删除某个文件夹(例如D盘下的temp文件夹)下的所有文件和文件夹:
1) 判断temp文件夹下的文件类型,如果是文件则直接删除
2) 如果是文件夹则获取该文件夹下的子文件和文件夹
3) 使用递归的方式删除所有temp文件夹下的文件和文件夹
File f = new File("D:\\temp");
del(f);
if (!f.exists()) {
System.out.println("删除成功!");
}
}
public static void del(File file) {
File[] array = file.listFiles();
if (array != null) {
for (File f : array) {
if (f.isDirectory()) {
del(f);
} else {
f.delete();
}
}
//删除目录
file.delete();
}
}