File类
在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成。
File 类定义了一些方法来操作文件,如新建、删除、重命名文件和目录等。
File概述和类构造方法
File是文件和目录路径名的抽象表示:
1.文件和目录是可以通过File封装成对象的
2.对于File而言,其封装的并不是一个真正的文件,仅仅是一个路径名而已,它是可以存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的
构造方法:
1.File(String path):如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文件。
2.File(String path, String name):path 是路径名,name 是文件名。当path为空时,默认为当前项目的路径。
3.File(File dir, String name):dir 是路径对象,name 是文件名。当dir为空时,默认为当前项目的路径
代码演示:
//项目路径:D:\ideaTest\FeiSi
String s = null;
//构造方法2
File file2 = new File(s, "a");
//获取当前对象的绝对路径
String absolutePath = file2.getAbsolutePath();
System.out.println(absolutePath);
File file = null;
//构造方法3
File file3 = new File(file, "a.txt");
String absolutePath1 = file3.getAbsolutePath();
System.out.println(absolutePath1);
输出:
D:\ideaTest\FeiSi\a
D:\ideaTest\FeiSi\a.txt
补充
绝对路径:从盘符开始的路径,这是一个完整的路径
相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
Windows 的路径分隔符使用反斜线“\”,而 Java 程序中的反斜线表示转义字符,所以如果需要在 Windows 的路径下包括反斜线,则应该使用两条反斜线或直接使用斜线“/”也可以。Java 程序支持将斜线当成平台无关的路径分隔符
File类创建功能
之前创建的File对象,并没有在我们的电脑上创建文件。这个File对象,相当于一个抽象的路径,想要创建文件或目录,需要使用File提供的方法.
public boolean creatNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件,如果目录不存在会报异常找不到路径
public boolean mkdir() 创建由此抽象路径名命名的目录
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录
@Test
public void cesi() throws IOException {
// mkdir方法,创建一个目录
// 如果目录不存在就创建一个目录,返回true
// 如果目录存在就不创建目录,并返回false
System.out.println("mkdir方法测试:");
File f1 = new File("D:/ceshi");//已经存在
File ff1 = new File("D:/ceshi2");//不存在
System.out.println(f1.mkdir());
System.out.println(ff1.mkdir());
// creatNewFile(),创建一个文件
// 如果文件不存在,就创建一个文件,并返回true
// 如果文件存在,就不创建文件,返回false
//在f1中创建一个文件
System.out.println("createNewFile方法测试:");
File f2 = new File(f1,"ioTest01.txt");//已经存在
File ff2 = new File(f1,"ioTest02.txt");//不存在
System.out.println(f2.createNewFile());
System.out.println(ff2.createNewFile());
// mkdirs(),创建目录
// 如果目录父路径不存在,直接创建所需的所有路径,并返回ture
// 如果该目录已存在,则不创建返回false
System.out.println("mkdirs方法测试:");
File f3 = new File("D:\\ceshi\\a");//已经存在
File ff3 = new File("D:\\ceshi\\a2");//不存在
System.out.println(f3.mkdirs());
System.out.println(ff3.mkdirs());
}
输出:
mkdir方法测试:
false
true
createNewFile方法测试:
false
true
mkdirs方法测试:
false
true
File类删除
public boolean delete() :删除由此抽象路径名表示的文件或目录
如果删除一个目录的下面还有文件,则无法删除。必须先删除目录下文件才可以删除父级目录
public void cesi2() throws IOException {
File file = new File("D:/ceshi");//该目录下面还有文件
boolean delete = file.delete();//删除失败
System.out.println(delete);
}
递归:
概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象
递归解决问题的思路:
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
递归策略只需要少量的程序就可描述出解题过程所需要的多次重复计算
递归解决问题要找到两个内容:
递归出口,否则会出现内存溢出
递归规则,与原问题相似的规模较小的问题
案例:删除一个目录
分析:删除一个目录,必须保证这个目录下面没有文件了。通过listFiles()方法获取这个目录下的文件,将他全部删除掉。但是无法知道这个目录下面是否还有文件夹,不知道还有几层文件夹。
这里就需要用到递归思想了。要删除这个目录,可以先考虑删除它的子目录,删除这个子目录就需要先删除它的子目录,就这样递归下去,直到没有子目录了,或者它里面是一个文件,就可以终止递归。
代码演示:
@Test
public static void ceshi3(File file) throws IOException {
//如果这个file对象为空,则终止递归
if (!file.exists()) {
return;
}
System.out.println("nihao");
//获取这个目录下面的文件
File[] files = file.listFiles();
//遍历这些文件,如果是目录,则继续递归。如果是文件则删除文件,且停止递归
for (File file1 : files) {
//如果不是文件,则继续递归下一层
if (!file1.isFile()) {
ceshi3(file1);
}
//否则直接将文件删除掉
file1.delete();
System.out.println("删除的文件:" + file1.getName());
}
//上面的操作执行完,也就说明这个目录里面的内容已经被删掉了,可以删除这个目录了。
System.out.println("删除的目录:" + file.delete());
}
}
错误记录:
判断File对象是否为空,之前写数组,字符串用习惯这种方法了,然后我判断File对象的时候也这样写,结果是行不通的,File对象提供了exists()方法来判断文件是否存在
if (file==null||file.length()==0){
return;
}