目录(directory): 表示计算机中的一个文件夹。用来存放文件。
文件(file):表示的就是计算机中的文件。用来存储数据。
路径(path):表示的就是计算机中的一个位置。这个位置可以是文件,也可以是文件夹。
在Java中可以使用File类表示计算机中的文件或文件夹。
注意:File这个英语单词表示的是文件。 但是在java中File类既可以表示文件,也可以表示文件夹。
1 File类
1.1 File类的四个静态成员变量
static String pathSeparator:是一个字符串类型路径分隔符。windows是;, linux是:
static char pathSeparatorChar:是一个字符类型的路径分隔符。
static String separator:字符串类型的名称分隔符。 windows是\,linux是/。 名称分隔符用来表示上下级关系。
static char separatorChar:字符类型的名称分隔符
注意:跨平台在不同系统上的时候建议用静态的,不要手动打,手动打的话不能跨平台。
1.2 uri和url(了解)
URI:Uniform Resource Identifier,统一资源标识符,包含URL
URL:Uniform Resource Locator,统一资源定位符
uri好像人的身份证号。
url好像人的地址。这个地址是非常详细,非常精确的,可以通过这个地址值找到他。
常见的rul:
https://www.baidu.com
http://www.qq.com
迅雷的下载链接
1.3 File类的构造方法
File类的构造方法。
File(String pathname):根据传入的字符串类型的路径构造一个File对象。
File(String parent, String child): 根据传入的父路径和子路径组合构造一个File对象。
比如: d:\aa\bb\cc.txt
父路径: d:\aa\bb
子路径: cc.txt
File(File parent, String child): 根据传入的父路径和子路径构造一个File对象。
File表示计算机中的文件或者文件夹。 并且File表示的文件和文件夹可以在计算机中是存在的,也可以是不存在。
如果不存在其实我们是可以通过File里面的功能区创建这个文件或者文件夹的。
1.4 File类的创建方法
boolean createNewFile(): 创建一个文件。如果文件已经存在,那么就创建失败。创建成功返回true,创建失败返回false。如果文件的上级目录不存在,就会抛出异常。
boolean mkdir(): 创建文件夹。 如果创建成功返回true否则返回false。 只能创建单级目录。创建文件夹时如果上级目录不存在,创建失败,返回false。
boolean mkdirs(): 创建文件夹。 可以创建多级目录。如果上级目录不存在,会自动创建。如果上级目录(文件夹)不存在,就会自动创建。
1.5 File类的删除方法
File类的删除方法
boolean delete(): 删除指定的文件或文件夹。如果不存在,那么删除失败。
注意:delete方法如果删除的是文件夹,那么只能删除空文件夹。假如文件夹中是有东西的,就删除失败。
【使用代码删除的东西,不走回收站】
1.6 File类的判断方法
boolean exists():判断这个文件或者文件夹是否存在。
boolean isFile(): 判断是否是文件。如果表示的路径在计算机中是不存在的,那么调用isFile方法得到的也是false。
boolean isDirectory():判断是否是文件夹。
boolean isAbsolute():判断File对象中封装的是否是绝对路径。
绝对路径:指的是从盘符开始的路径。 比如: d:\a.txt
相对路径:指的不是从盘符开始的路径。在eclipse下面相对路径相对的当前项目。比如:a.txt。 aa\bb\cc.txt
boolean isHidden():判断是否是隐藏的。
1.7 File类的获取方法
String getName(): 获取文件或者文件夹的名字。不管文件或者文件夹是否存在,都可以获取到,因为是通过切割得到的结果。
String getPath(): 获取一个字符串类型的路径。如果创建File对象时传递的是相对路径那么得到的就是相对路径。如果传递的是绝对路径,那么得到的就是绝对路径
long length(): 获取文件的字节数大小。 如果通过文件夹调用这个方法,得到的是一个不确定的数字。
如果获取文件夹的大小,可以把这个文件夹下面的所有文件的字节数大小加起来。
File getAbsoluteFile():获取File类型的绝对路径。
String getAbsolutePath(): 获取字符串类型的绝对路径。
File getParentFile(): 获取File类型的父路径
String getParent(): 获取字符串类型的父路径。
1.8 File类中的listRoots和list方法(了解)
static File[] listRoots(): 获取到当前计算机中的所有根目录。在windows下就是每个盘符。
String[] list():获取指定目录下的所有文件和文件夹的名字,并且放入到字符串数组中返回。
1.9 File类的listFiles方法(重要)
File[] listFiles(): 获取一个文件夹下面的所有的东西(包括文件也包括文件夹)。 返回File数组。
如果文件夹不存在,通过这个文件夹调用listFiles得到的结果是null。
如果file对象表示的是一个文件,调用listFiles得到的结果同样是null。
如果file对象表示的是一个文件夹,只不过这个文件夹下面没有内容,那么调用listFiles也一样可以得到一个File数组,只不过file数组中的没有任何内容。
1.10 Flie类中的过滤器
如果希望在获取一个文件夹下面所有的东西时过滤掉自己不想要的东西,就可以使用过滤器。
在File类下,有一个方法,可以传递一个过滤器。
File[] listFiles(FileFilter filter):传递一个过滤器,可以根据过滤器过滤掉自己不想要的内容。
FileFilter接口表示过滤器。
里面有一个方法,可以实现一个过滤的效果。
boolean accept(File pathname):如果希望某个文件过滤掉,那么就让这个方法返回false。 如果希望某个文件留下,那么就让这个方法返回true。
因为FileFilter是一个接口里面的accept是一个抽象方法,所以里面的过滤规则需要我们自己在实现类中去定义。
过滤器使用的步骤:
1. 定义一个实现类,去实现FileFilter接口。重写里面的accept方法。
2. 在accept方法中定义自己的过滤规则,如果 建File对象。调用File对象的listFiles方法,传递一个过滤器对象。
2 递归
2.1 递归的概念以及递归的调用方式
直接调用: 直接调用方法自己本身。
间接调用:间接调用方法自己本身。 A->B,B->C,C->A
递归的注意事项:
1. 递归一定要有结束的条件。否则会栈内存溢出(每调用一次方法都会在栈内存中开辟一部分空间)。遇见return就停了。
2. 递归的次数不能太多。否则会栈内存溢出。
递归的使用场景:在层级不确定的时候使用递归。
2.2 递归调用指定的文件夹
package cn.itcast.demo03.digui;
import java.io.File;
/*
递归调用:指的是方法调用方法自己。
*/
public class Demo01PrintDir {
public static void main(String[] args) {
printDir(new File("d:\\明星"));
}
/*
* 定义方法,打印指定文件夹下面的所有的文件名。
*/
public static void printDir(File dir) {
//调用listFile获取到指定目录下的所有的文件和文件夹
File[] files = dir.listFiles();
//遍历这个数组,打印内容
for(File thisFile : files) {
//判断,如果当前遍历到的File对象是一个文件夹,那么就遍历打印这个文件夹里面的内容。
// 如果是一个文件,就直接打印名字。
if(thisFile.isDirectory()) {
//如果是一个文件夹,那么就继续递归调用这个方法来遍历文件夹。
printDir(thisFile);
} else {
//否则表示这是一个文件,直接打印名字。
System.out.println(thisFile.getName());
}
}
}
}
2.3 递归求阶乘
求阶乘方式
5! = 5 * 4 * 3 * 2 * 1;
4! = 4 * 3 * 2 * 1;
3! = 3 * 2 * 1;
2! = 2 * 1;
1! = 1;
另一种计算方式:
5! = 5 * 4!;
4! = 4 * 3!;
3! = 3 * 2!;
2! = 2 * 1!;
1! = 1;
public class Demo03JieCheng {
public static void main(String[] args) {
int result = getJieCheng(5);
System.out.println("result:" + result);//120
}
/*
* 定义方法,使用递归求指定数字的阶乘
* 参数: 指定数字。
* 返回值: 求出来的结果
*/
public static int getJieCheng(int num) {
//如果这个数是1,那么1的阶乘是固定值1,就直接返回1
if(num == 1) {
return 1;
}
//如果是其他情况。
//结果 = 当前数字 * (当前数字-1的阶乘)
return num * getJieCheng(num - 1);
}
}