File
1.1 File类概述和构造方法
File:是文件和目录路径名的抽象表示
文件和目录是可以通过File封装成对象的
对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径。它是可以存在的也是可以不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在。
File的构造方法
方法名 | 说明 |
---|---|
File(String pathname) | 将给定的路径名字符串转换为抽象路径名来创建新的File实例 |
File(String parent,String child) | 从父路径字符串和子路径名字符串创建新的File实例 |
File(File parent,String child) | 从父抽象路径名和子路径名字符串创建新的File实例 |
构造方法的使用
package dailyFile;
import java.io.File;
public class FileDemo01 {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\n\\Desktop\\personal\\javafile.txt" );
System.out.println(f1);
File f2 = new File("C:\\Users\\n\\Desktop\\personal","javafile.txt");
System.out.println(f2);
File f3 = new File("C:\\Users\\n\\Desktop\\personal");
File f4 = new File(f3,"javafile.txt");
System.out.println(f4);
}
}
输出结果:
C:\Users\n\Desktop\personal\javafile.txt
C:\Users\n\Desktop\personal\javafile.txt
C:\Users\n\Desktop\personal\javafile.txt
1.2 File类创建功能
方法名 | 说明 |
---|---|
public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件 |
public boolean mkdir() | 创建此抽象路径名命名的目录 |
public boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录 |
createNewFile()、 mkdir()、mkdirs()的使用
package dailyFile;
import java.io.File;
import java.io.IOException;
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("C:\\Users\\n\\Desktop\\personal\\javafile.txt");
System.out.println(f1.createNewFile());
File f2 = new File("C:\\Users\\n\\Desktop\\personal\\java");
System.out.println(f2.mkdir());
File f3 = new File("C:\\Users\\n\\Desktop\\personal\\javaDemo\\java");
System.out.println(f3.mkdirs());
}
}
System.out.println(f1.createNewFile());
//如果创建成功返回true,创建失败返回false
System.out.println(f2.mkdir());
//如果创建成功返回true,创建失败返回false
System.out.println(f3.mkdirs());
//如果创建成功返回true,创建失败返回false
1.3 File类判断和获取功能
方法名 | 说明 |
---|---|
public boolean isDirectory() | 返回此抽象路径名是否为目录 |
public boolean isFile() | 返回此抽象路径名是否为文件 |
public boolean exists() | 返回此抽象路径名表示的File是否存在 |
public String getAbsolutePath() | 返回此抽象路径的绝对路径名字符串 |
public String getPath() | 将此抽象路径名转换为路径名字符串 |
public String getName() | 返回由此抽象路径名表示的文件或目录的名称 |
public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
public File[] listFiles() | 返回此抽象路径名表示目录中的文件和目录的File对象数组 |
如果要使用抽象路径时,只允许是当前代码文件所在的相对路径
package dailyFile;
import java.io.File;
import java.io.IOException;
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("C:\\Users\\n\\Desktop\\personal\\javafile.txt");
// System.out.println(f1.createNewFile());
File f2 = new File("C:\\Users\\n\\Desktop\\personal\\java");
// System.out.println(f2.mkdir());
File f3 = new File("C:\\Users\\n\\Desktop\\personal\\javaDemo\\java");
// System.out.println(f3.mkdirs());
File f5 = new File("src\\dailyFile\\javafile.txt");
f5.createNewFile();
System.out.println(f1.exists());
System.out.println(f5.exists());
System.out.println(f5.isFile());
System.out.println(f5.isDirectory());
System.out.println(f5.getAbsoluteFile());
System.out.println(f5.getName());//返回文件名
File f6 = new File("src\\dailyFile\\");
String[] strArray = f6.list();
for(String str:strArray){
System.out.println(str);
}
File[] strAbArray = f6.listFiles();
for(File file:strAbArray){
System.out.println(file);
}
}
}
1.4 File类删除功能
public boolean delete() 删除由此抽象路径名表示的文件或目录
绝对路径和相对路径的区别:
绝对路径:完整的路径名,不需要任何其他信息就可以定位它表示的文件
相对路径:必须使用其他路径名的信息进行解释
File f = new File(".\\testforFile");
System.out.println(f.mkdir());
System.out.println(f.exists());
System.out.println(f.isDirectory());
System.out.println( f.delete());
System.out.println(f.exists());
如果删除的目录下有内容时,该目录不能被直接删除,必须先删除目录下的内容,再删除目录。
1.5 递归
递归概述:递归一般是指方法定义中调用方法本身的现象。
回顾不死神兔问题:
package dailyFile;
public class FileDemo04 {
public static void main(String[] args) {
int[] arr = new int[20];
arr[0] = 1;
arr[1] = 1;
for(int i=2;i<arr.length;i++){
arr[i] = arr[i-1] + arr[i-2];
}
System.out.println(arr[19]);
}
/*
递归解决问题:首先就是要定义一个方法
定义一个方法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);
}
}
}
递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需要少量的程序就可以描述出解决问题过程中所需要的多次重复计算。
递归解决问题要找到的两个内容:
1.递归出口:否则会出现内存溢出;
2.递归规则:与原问题相似的规模较小的问题
1.6 递归求阶乘
需求:用递归求5的阶乘,并把结果在控制台输出
package dailyFile;
public class FileDemo05 {
public static void main(String[] args) {
int res = Factorial(5);
System.out.println(res);
}
public static int Factorial(int n){
if(n==1){
return 1;
}else {
return n*Factorial(n-1);
}
}
}
递归求阶乘的内存图
1.main方法和int result 进栈内存
2.result调用了Factorial()方法,该方法进栈,参数为5,返回 5Factorial(4)
3. 5Factorial(4)调用Factorial方法,方法进栈,参数为4,返回4Factorial(3)
4. 4Factorial(3)调用Factorial方法,方法进栈,参数为3,返回3Factorial(2)
5. 3Factorial(2)调用Factorial方法,方法进栈,参数为3,返回2Factorial(1)
6. 2Factorial(1)调用Factorial方法,方法进栈,参数为3,返回1==>此处可以看成是递归方法的出口
7. 接下来依次开始出栈
1.7 遍历目录
需求:给定一个路径(E:\itcase)通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
思路:
1.根据给定的路径创建一个File对象
2.定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的File对象
3.获取给定的File目录下的所有文件或者目录的File数组
4.遍历该File数组,得到每一个File对象
5.判断该File对象是否是目录
是:递归调用
否:获取绝对路径输出在控制台
6.调用方法
package dailyFile;
import java.io.File;
public class FolderFactorial {
public static void main(String[] args) {
File f = new File("src");
getAllFile(f);
}
public static void getAllFile(File f) {
File[] fileArray = f.listFiles();
if (fileArray != null) {
for (File file : fileArray) {
if (file.isDirectory()) {
getAllFile(file);
} else {
System.out.println(file.getAbsolutePath());
}
}
}
}
}
这里递归方法的出口为:否:获取绝对路径输出在控制台