黑马程序员全套Java教程_Java基础教程_IO流之File(三十)
- 1.1、File类概述
- 1.2 File类的创建功能
- 1.3 File类删除功能
- 1.4 File类判断和获取功能
- 1.5 递归
- 案例:递归求阶乘
- 案例:遍历目录
1.1、File类概述
- File:它是文件和目录路径名的抽象表示,怎么理解呢?
(1)文件和目录可以通过File封装成对象;
(2)对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而言。它可以是存在的,也可以是不存在的,将来是要通过具体的操作把这个路径的内容展缓为具体的存在的。 - 构造方法:
| 方法名 | 说明 |
|---|
| Flie(String pathname) | 通过将指定的路径名字符串转换为抽象路径名来创建新的File实例 |
| File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的File实例 |
| File(File parent, String chile) | 从父路径名和子路径名字符串创建新的File实例 |
public static void main(String[] args) {
File file1 = new File("D:\Java\qq.txt");
System.out.println(file1);//D:Javaqq.txt
File file2 = new File("D:\Java","qq.txt");
System.out.println(file2);//D:Javaqq.txt
File file3 = new File("D:\Java");
File file4 = new File(file3,"qq.txt");
System.out.println(file4);//D:Javaqq.txt
}
1.2 File类的创建功能
| 方法名 | 说明 |
|---|
| public boolean createNewFile() | 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件夹 |
| public boolean mkdir() | 创建由此抽象路径名命名的目录 |
| public boolean mkdirs() | 创建由此路径名命名的目录,包括任何必须但不存在的父目录(用于创建多级目录) |
public static void main(String[] args) throws IOException {
File f1 = new File("E:\itcast\java.txt");
System.out.println(f1.createNewFile());//如果没有itcast路径会报错:IOException系统找不到指定的路径。创建成功返回true。目录文件已经存在也会返回false。
File f2 = new File("E:\itcast\JavaSE");
System.out.println(f2.mkdir());//true
File f3 = new File("E:\itcast\JavaWEB\HTML");
//System.out.println(f3.mkdir());//false,说明mkdir()不可以创建多级目录
System.out.println(f3.mkdirs());//true
File f4 = new File("E:\itcast\javase.txt");
//System.out.println(f4.mkdir());//true,但创建出来的只是一个文件夹
System.out.println(f4.createNewFile());//注意如果E:itcast目录内已经有一个名为javase.txt的文件或者文件夹,会创建失败。
}
1.3 File类删除功能
- public boolean delete():删除由此路径名表示的文件或目录
- 绝对路径和相对路径的区别:
(1)绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:E:itcastjava.txt;
(2)相对路径:必须使用取自其他路径名的信息进行解释。例如:myFilejava.txt。 - 删除目录时注意事项:如果一个目录中有内容(目录,文件),则不能直接删除。应该先删除目录中的内容,最后才能删除目录。
public static void main(String[] args) throws IOException {
File f1 = new File("javase.txt");//可能是因为版本不一样,前面不需要加myFile前缀
//System.out.println(f1.createNewFile());
System.out.println(f1.delete());
File f2 = new File("itcast");
System.out.println(f2.mkdir());
System.out.println(f2.delete());
File f3 = new File("itcast");
System.out.println(f3.mkdir());
File f4 = new File("itcast\java.txt");
System.out.println(f4.createNewFile());
System.out.println(f3.delete());//false
System.out.println(f4.delete());
System.out.println(f3.delete());
}
1.4 File类判断和获取功能
| 方法名 | 说明 |
|---|
| public boolean isDirectory() | 测试此抽象路径名表示的File是否为目录 |
| public boolean isFile() | ……是否为文件 |
| public boolean exists() | ……是否存在 |
| public String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串 |
| public String getPath() | 返回此抽象路径名转换为路径名字符串 |
| public String getName() | 返回此抽象路径名表示的文件或者目录的名称 |
| public String[] list() | 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组 |
| public File[] listFiles() | ……文件和目录的File对象数组 |
public static void main(String[] args) {
File f = new File("java.txt");
System.out.println(f.isDirectory());//false
System.out.println(f.isFile());//true
System.out.println(f.exists());//true
System.out.println(f.getAbsolutePath());//C:Users...DesktopcodemyFilejava.txt
System.out.println(f.getPath());//这里输出的是我们给f传入的pathname,即java.txt
System.out.println(f.getName());//文件名称java.txt
File f2 = new File("E:\itcast");
String[] strArray = f2.list();
for (String str : strArray){
System.out.print(str + " ");//java.txt JavaSE javase.txt JavaWEB
}
System.out.println();
File[] fileArray = f2.listFiles();
for (File file : fileArray){
//System.out.print(file + " ");//E:itcastjava.txt E:itcastJavaSE E:itcastjavase.txt E:itcastJavaWEB
//System.out.print(file.getName() + " ");//java.txt JavaSE javase.txt JavaWEB
if (file.isFile()) {
System.out.print(file.getName() + " ");//java.txt javase.txt
}
}
}
1.5 递归
- 递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象。
- 回顾不死神兔问题,兔子第一个月是一对,第二个月不变,从第三个月开始,兔子对数为前两个月兔子对数之和,求第29个月兔子的对数。
我们原来的做法:
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]);
}
而使用递归:
public static void main(String[] args) {
System.out.println(f(20));
}
public static int f(int n){
//return f(n - 1) + f(n -2);//不经过判断的话产生StackOverflowError:当堆栈溢出发生时抛出一个应用程序太深的错误
if (n==1||n==2){
return 1;
}else return f(n - 1) + f(n -2);
}
- 递归解决问题的思路:
(1)把一个复杂的问题层层转换为一个与原问题相似的规模较小的问题来解决;
(2)递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算。 - 递归解决问题要找到两个内容:
(1)递归出口:否则会出现内存溢出;
(2)递归规则:与原问题相似的规模较小的问题。
案例:递归求阶乘
- 需求:用递归求5的阶乘,并把结果输出在控制台。
- 分析:
(1)阶乘:一个正整数的阶乘是所有小于及等于该数的正整数的积,自然数n的阶乘写作n!。如5!=54321;
(2)递归出口:1!=1;
(2)递归规则:n!=n*(n-1)!,如5!=5*4! - 思路:
(1)定义一个方法,用于递归求阶乘,参数为一个int类型的变量;
(2)在方法内部判断该变量的值是否为1。是则返回1,否则返回n*(n-1)!;
(3)调用方法;
(4)输出结果
public static void main(String[] args) {
System.out.println(factorial(5));
}
public static int factorial(int n) {
if (n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
案例:遍历目录
- 需求:给定一个路径(E:itcast),请通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台。
- 思路:
(1)根据给定的路径创建一个File对象;
(2)定义一个方法,用于获取给定目录下的所有内容,参数为第一步创建的File对象;
(3)获取给定的File目录下所有的文件或者目录的File数组;
(4)遍历该File数组,得到每一个File对象;
(5)判断该File对象是否是目录。是则递归调用;反之获取绝对路径输出在控制台;
(6)调用方法。
public static void main(String[] args) {
File f = new File("E:\itcast");
DirRecursion(f);
}
public static void DirRecursion(File file){
File[] fileArray = file.listFiles();
if (fileArray!=null) {
for (File f : fileArray) {
if (f.isFile()) {
System.out.println(f.getAbsolutePath());
} else {
DirRecursion(f);
}
}
}
}