一、File
目录(Directory):计算机中的文件夹, 用来存放文件。
文件(File): 表示计算机中的文件。
路径(Path): 既表示文件夹,也表示文件。 指的其实就是计算机中的一个位置。
在java中可以使用File类表示计算机中的一个路径。File在英语中是文件的意思,但是在java中表示路径。所以File类可以表示计算机中的文件或者文件夹。
我们可以通过File类的方法完成一些对文件或者文件夹操作的功能。
1.1构造方法
File的构造方法:
-
File(String pathname):根据一个文件或者文件夹的路径构造一个File对象。
-
File(String parent, String child):根据父路径和子路径组合构造一个File对象。
- 比如: d:\iotest\aa.txt
- 父路径: d:\iotest
- 子路径: aa.txt
-
File(File parent, String child):根据父路径和子路径组合构造一个File对象。
注意:
File既可以表示计算机中的文件,也可以表示计算机中的文件夹。
这个表示的东西可以在计算机中是存在的,也可以是不存在的。
public class Demo02FileConstructor {
public static void main(String[] args) {
method3();
}
//File(File parent, String child):根据父路径和子路径组合构造一个File对象。
public static void method3() {
//创建一个File类型的父路径
File parent = new File("d:\\iotest");
//创建一个File对象
File file = new File(parent, "aa.txt");
System.out.println(file);
}
//File(String parent, String child):根据父路径和子路径组合构造一个File对象。
public static void method2() {
//File(String parent, String child):根据父路径和子路径组合构造一个File对象。
//使用这个File对象表示计算机d盘下iotest里面的aa.txt
File file = new File("d:\\iotest", "aa.txt");
System.out.println(file);
}
public static void method1() {
//File(String pathname):根据一个文件或者文件夹的路径构造一个File对象。
//在java中\表示转义字符,表示对后面的字符改变意思。如果想要表示一个单纯的反斜线,需要写\\
File file = new File("d:\\iotest\\aa.txt");//这个File对象表示的d盘下的iotest下面的aa.txt
System.out.println(file);
File file2 = new File("d:\\iotest\\bb");
System.out.println(file2);
}
}
1.2路径问题
绝对路径: 是一个从盘符开始的路径,是一个非常详细的路径。 比如: d:\aa\bb.txt d:\aa
相对路径: 指的不是从盘符开始的路径,相对路径相对的是某一个位置,在idea中,相对路径指的是当前项目下的东西。比如: a.txt。 指的是当前项目也就是day08项目下的a.txt
1.3获取方法
String getAbsolutePath(): 获取当前file对象的绝对路径
String getPath(): 获取File对象表示的路径
String getParent():获取父级目录
String getName(): 获取file对象表示的文件或者文件夹的名字
long length(): 获取【文件】的字节数大小。如果通过文件夹调用这个方法,得到的是一个不确定的值。
public class Demo04FileMethod {
public static void main(String[] args) {
method4();
}
// long length(): 获取【文件】的字节数大小。如果通过文件夹调用这个方法,得到的是一个不确定的值。
public static void method4() {
//创建一个File对象
//File file = new File("d:\\iotest\\aa.txt");
//
File file = new File("d:\\iotest");
//调用length方法获取这个文件的字节数大小
long len = file.length();
System.out.println("len:" + len);
}
//String getName(): 获取file对象表示的文件或者文件夹的名字
public static void method3() {
//创建一个File对象
//File file = new File("d:\\iotest\\aa.txt");
//File file = new File("d:\\iotest\\bb");
File file = new File("d:\\iotest\\cc");
//调用getName方法,获取到这个文件的名字
System.out.println(file.getName());
}
//String getPath(): 获取File对象表示的路径
//构造方法中传递是什么路径,获取的就是什么路径。
public static void method2() {
//创建一个File对象
//File file = new File("d:\\iotest\\aa.txt");
File file = new File("aa.txt");
//调用getPath获取这个file对象表示的路径
System.out.println(file.getPath());
}
//String getAbsolutePath(): 获取当前file对象的绝对路径
public static void method1() {
//创建一个File对象
//File file = new File("d:\\iotest\\aa.txt");
File file = new File("aa.txt");//这个是相对路径,指的是当前项目下的aa.txt
//获取这个file对象表示文件或文件夹的绝对路径
System.out.println(file.getAbsolutePath());
}
}
1.4 判断方法
public boolean exists(): 判断File对象所表示的文件或者文件夹是否存在
boolean isDirectory(): 判断当前File对象表示的是否是一个文件夹
boolean isFile() :判断当前File对象表示的是否是一个文件
public class Demo05FileMethod {
public static void main(String[] args) {
method3();
}
//boolean isFile() :判断当前File对象表示的是否是一个文件
public static void method3() {
//创建File对象
//File file = new File("d:\\iotest\\aa.txt");
//File file = new File("d:\\iotest\\bb");
File file = new File("d:\\iotest\\cc");
//调用isFile方法,判断是否是一个文件
System.out.println(file.isFile());
}
//boolean isDirectory(): 判断当前File对象表示的是否是一个文件夹
public static void method2() {
//创建File对象
//File file = new File("d:\\iotest\\aa.txt");
//File file = new File("d:\\iotest\\bb");
File file = new File("d:\\iotest\\cc");
//调用isDirectory方法判断是否是文件夹
boolean flag = file.isDirectory();
System.out.println("flag:" + flag);
}
public static void method1() {
//创建File对象
//File file = new File("d:\\iotest\\aa.txt");
//File file = new File("d:\\iotest\\bb");
File file = new File("d:\\iotest\\cc");
//调用file的exists判断这个东西是否存在
boolean flag = file.exists();
System.out.println("flag: " + flag);
}
}
1.5创建功能
boolean createNewFile(): 创建一个文件,如果文件已经存在,则创建失败。
boolean mkdir(): 创建一个文件夹,如果文件夹已经存在则创建失败。 如果上级目录不存在则创建失败。
boolean mkdirs(): 创建多级目录(文件夹)如果上级目录不存在,会一起创建上级目录。
public class Demo06FileMethod {
public static void main(String[] args) throws IOException {
method3();
}
//boolean mkdirs(): 创建多级目录(文件夹)
public static void method3() {
//创建File对象
//File file = new File("d:\\iotest\\ee");
File file = new File("d:\\iotest1\\ee");
//调用mkdirs
boolean flag = file.mkdirs();
System.out.println("flag:" + flag);
}
//boolean mkdir(): 创建一个文件夹,如果文件夹已经存在则创建失败
//如果上级目录不存在,则创建失败并返回false,不会抛出异常。
public static void method2() {
//创建一个File对象
//File file = new File("d:\\iotest\\dd");
//File file = new File("d:\\iotest\\ee.txt");
File file = new File("d:\\iotest1\\aa");
//调用mkdir创建文件夹
boolean flag = file.mkdir();
System.out.println("flag: " + flag);
}
//boolean createNewFile(): 创建一个文件,如果文件已经存在,则创建失败。
//如果上级目录不存在,则抛出异常。
public static void method1() throws IOException {
//创建file对象
//File file = new File("d:\\iotest\\cc.txt");
//File file = new File("d:\\iotest\\新建文件夹");
File file = new File("d:\\iotest1\\aa.txt");
//调用createNewFile方法,创建这个文件
boolean flag = file.createNewFile();
System.out.println("flag:" + flag);
}
}
1.6 删除方法
boolean delete(): 删除File对象所表示的文件或者文件夹。如果不存在删除失败。
如果要删除的是一个文件夹,只能删除空文件夹,如果这个文件夹里面有内容,是不能删除的。
注意:
【delete方法删除掉的内容不走回收站,删除需谨慎】
public class Demo07FileMethod {
public static void main(String[] args) {
//创建File对象
File file = new File("D:\\iotest");
//删除
boolean flag = file.delete();
System.out.println("flag:" + flag);
}
}
1.7 遍历的方法
String[] list(): 可以获取到指定目录中的所有文件或文件夹,获取到的真正是文件或者文件夹的名字。
(非常重要)File[] listFiles(): 获取到指定目录下的所有文件或者文件夹,返回值是File数组
如果指定的目录下面没有内容,调用listFiles之后得到的是一个空数组。 File[] files = {};
如果通过文件调用listFiles得到的结果是null。 File[] files = null;
public class Demo08FileMethod {
public static void main(String[] args) {
method2();
}
//(非常重要)File[] listFiles(): 获取到指定目录下的所有文件或者文件夹,返回值是File数组
public static void method2() {
//创建一个File对象
File file = new File("d:\\iotest\\aa.txt");
//调用listFiles获取这个目录下面的所有的东西
File[] files = file.listFiles();
//遍历
for (File thisFile : files) {
//thisFile表示的是指定目录中的每一个文件和文件夹
System.out.println(thisFile);
}
}
//String[] list(): 可以获取到指定目录中的所有文件或文件夹.
public static void method1() {
//创建File对象
File file = new File("d:\\iotest");
String[] files = file.list();
//循环遍历数组,看一下数组中有什么内容
for (String thisFile : files) {
System.out.println(thisFile);
}
}
}
二、递归
递归:
方法直接或者间接的调用方法自己。
递归有两种调用方法
直接递归:
方法A -> 方法A
间接递归:
方法A -> 方法B -> 方法A
注意:
1. 递归一定要有出口(递归一定要有结束条件)。
2. 递归次数不能太多。
原因:
如果递归调用次数过多,就会栈内存溢出。
内存溢出: 指的是内存满了,不能再开辟空间了。
内存泄漏: 指的是一些对象没有用了,但是无法回收。
内存泄漏会导致内存溢出。
public class Demo02JieCheng {
public static void main(String[] args) {
//求5阶乘
int result = getJieCheng(5);
System.out.println("result:" + result);
}
/*
定义方法,求指定数字的阶乘
参数: 要计算阶乘的数字。
返回值: 结果
*/
public static int getJieCheng(int num) {
//1的阶乘是固定值1
if(num == 1) {
return 1;
}
//如果是其他情况
return num * getJieCheng(num - 1);
}
}
过滤器
如果想要在获取一个目录下所有内容的时候就过滤掉自己不想要的内容, 可以使用过滤器。
File里面,还有一个listFiles方法,可以传递一个过滤器, File[] listFiles(FileFilter filter)
FileFilter表示过滤器,是一个接口。
过滤器的使用步骤:
1. 创建一个类,实现FileFilter接口。
2. 重写accept方法,定义过滤的规则。 如果希望某个东西留下,就通过某种条件返回true,否则就返回false。
3. 在测试类中创建File对象,并且调用listFiles方法,传递一个过滤器。
public class Demo02FileFilter {
public static void main(String[] args) {
//创建一个File对象
File file = new File("d:\\aaa");
printLambda(file);
}
public static void printFileName(File dir) {
//调用listFiles方法
File[] files = dir.listFiles(new MyFileFilter());
for (File thisFile : files) {
//如果遍历到的是文件夹,递归调用方法,获取文件夹中的内容。
if(thisFile.isDirectory()) {
printFileName(thisFile);
} else {
//如果是一个文件,那么就直接打印
System.out.println(thisFile.getAbsolutePath());
}
}
}
//MyFileFilter是我们自己定义的过滤器类
public class MyFileFilter implements FileFilter{
//accept里面要定义比较的规则
//参数pathname: 表示指定目录中的每一个文件或者文件夹
//返回值: 如果希望某个东西留下,就返回true。如果希望过滤掉,就返回false
@Override
public boolean accept(File pathname) {
//如果这是一个文件,并且是以.txt结尾,那么就留下
if(pathname.isFile() && pathname.getName().endsWith(".txt")) {
return true;
}
//还需要留下文件夹。因为我们还需要获取文件夹中的内容
if(pathname.isDirectory()) {
return true;
}
return false;
}
}