File类
为什么需要File类:
File类可以用来对文件的属性进行操作,也可以创建和删除文件;
如何区分文件和文件夹:
虽然你能认清什么是文件,什么是文件夹,但是你能用语言清楚的表达么?
文件:一般情况下,我们把带有后缀名的称为文件;
文件夹: 我们把不带后缀名的称为文件夹,即目录;
那有人说,我的电脑里面的文件有的也是没有后缀名的呀?那是为什么呢?因为你没有把后缀名隐藏给关闭,所以你看不到文件的后缀名,可以自行百度解决;
概念: File类是文件和目录路径名的抽象表示,目录和路径都可以用File类来表示;但是要注意,我虽然给了一个路径,但是并不代表根据这个路径就一定能找到指定的文件,所以File类的对象可以是真实存在的File文件也可以不是;
File类的构造方法
构造方法 | 方法说明 |
---|---|
File(String pathname) | 根据给定的路径名来创建文件对象 |
File(String parent, String child) | 根据给定的父路径和子路径来创建文件对象 |
File(File parent, String child) | 根据给定的父类文件对象和子路径来创建文件对象 |
代码示例:
public class Demo{
public static void main(String[] args) {
// 创建F盘下的a.txt的文件对象
File file1 = new File("F:\\a.txt");
// 通过给定的父路径和子路径来创建a.txt的文件对象
File file2 = new File("F:\\java", "a.txt");
// 通常父路径都为文件夹路径,子路径为文件名也可以为文件夹+文件名
File file3 = new File("F:\\java", "demo01\\a.txt");
// 通过给定的父文件对象和子路径来创建a.txt文件对象
File file4 = new File(file2, "demo\\a.txt");
}
}
为什么没有无参构造方法?
因为如果我通过无参构造方法创建了文件对象,可是我们都知道一个电脑上面有很多的文件和文件夹,那么,通过该方式创建的文件对象,到底指向我们电脑中的哪个文件或文件夹呢?我们不得而知,所以,要这个无参构造方法是没有任何意义的;
File类的方法
方法 | 方法说明 |
---|---|
boolean canRead() | 判断文件是否可读 |
boolean canWrite() | 判断文件是否可写 |
boolean createNewFile() | 创建新的文件 |
boolean delete() | 删除文件或目录 |
boolean exists() | 判断文件或目录是否存在 |
boolean isFile() | 判断文件是否是文件 |
boolean isDirectory() | 判断是否是目录文件 |
boolean mkdir() | 创建目录文件 |
boolean mkdirs() | 创建多级目录 |
String getAbsolutePath() | 获取文件的绝对路径 |
String getPath() | 获取传入构造方法中的路径 |
创建文件:
public static void main(String[] args) {
File file = new File("F:\\a.txt");
// 判断文件是否存在
if (file.exists()) {
file.delete(); // 如果存在,则删除原文件
file.mkdir();
} else {
file.mkdir(); // 不存在,则创建该文件
}
System.out.println("文件创建成功");
}
注意: 这里运用了delete()方法,它既可以删除文件也可以删除目录,但是被该方法删除的文件和目录不会出现在回收站中,直接被永久的删除了,所以要小心使用;与此同时,如果删除一个目录,而目录中包含其他的文件时,该目录不能被成功删除,其返回值为false;
代码示例:
public static void main(String[] args) {
File file = new File("F:\\FileTest\\a.txt");
System.out.println(file.mkdirs());
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
}
运行结果:
true
true
true
true
false
有人可能对isDirectory()的运行结果感到困惑,心想:我明明创建的txt文件,为什么调用isDirectory()方法还返回true呢?因为,我们创建的时候调用的是mkdirs()方法,该方法是创建多级目录,它不包含创建文件的功能,它只能创建目录,所以我们在创建文件的时候一定要小心,不是路径是文件的路径就一定创建出来的就是文件,是不是文件的决定权取决于你所调用的方法,如果是createNewFile(),那么创建出来的就是文件;
递归
概念:
递归指的是方法直接或间接的调用本身的一种现象;即:方法自己调用自己;
为什么需要递归:
为了简化复杂而重复的问题,如求阶乘时,其实总是重复于求解f(n - 1),当是用来递归的时候,只需要调用自身,就可以完成,而不需要我们去不断的去寻求f(n - 1)的解;递归还有很多的应用场景;
递归的条件:
递归头:递归结束的条件;
递归体:调用自身的语句;
递归的注意事项:
-
如果没有结束条件,那么就会引发栈内存溢出;为什么呢?
答:我们都知道方法存在于栈中,每当调用方法时就会将方法加载到栈中,如果没有结束条件,那么就会一直加载递归方法,直到耗尽了所有的栈内存然后溢出报错;
-
虽然递归有结束条件,递归调用的次数不易过多,否则栈内存溢出,这又是为什么呢?
答:虽然有了结束条件,可以让我们的递归结束了,但是调用的次数达到了栈内存的极限,那么依旧会出现栈内存溢出的现象;
递归求阶乘:
public static void main(String[] args) {
System.out.println(test(5));
}
public static int test(int n) {
if (n == 1) { // 递归头,当n==1时,结束递归
return n;
} else {
return n * test(n -1); // 阶乘的特性
}
}
运行结果:
120
递归遍历文件:
public static void test(File file) {
if (file.exists()) {
File[] files = file.listFiles();
if (files != null)
for (File f : files) {
if (f.isFile()) {
System.out.println(f.getName());
} else {
System.out.println(f.getName());
test(f);
}
}
}
}