1 File类概述
File类将文件或文件夹抽象为一个类,可以通过调用File类的方法来实现对文件或文件夹的查询,增删操作;File通过路径进行初始化,所表示的文件或文件夹在系统中可以不存在。
2 相对路径和绝对路径
(1)绝对路径是从盘符开始表示的路径,可以在文件的任意位置都可以被识别,但是书写较长,开发中不常用;
(2)相对路径,是依赖于某一个路径的省略写法,只能在其依赖路径下被识别,书写简便,开发中经常使用。
3 File类常用方法
(1)构造方法
1)public File(String pathname);使用字符串路径名来初始化文件对象;
2)public File(String parent , String child),使用分开的字符串路径来初始化文件对象
3)public File(File parent,String child),使用File父路径和字符串子路径来初始化对象
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);
// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);
// 通过父路径和子路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
(2)获取方法
1)public String getAbsolutePath():返回此文件对象的绝对路径;
2)public String getPath():获取该文件对象在初始化时使用的路径,File的toString()方法直接调用该方法;
3)public String getName():获取该文件名称(也就是文件路径的最后一级);
4)public long length():返回此文件的字节长度,不常用(只能正确表示简单文件,复杂文件表示不准)。
注意:length只能表示文件长度,如果是文件夹,返回为指定值,实际代码测试结果:一直表示4096字节,和实际文件夹内所有文件大小总和不符
public class FileGet {
public static void main(String[] args) {
File f = new File("d:/aaa/bbb.java");
System.out.println("文件绝对路径:"+f.getAbsolutePath());
System.out.println("文件构造路径:"+f.getPath());
System.out.println("文件名称:"+f.getName());
System.out.println("文件长度:"+f.length()+"字节");
File f2 = new File("d:/aaa");
System.out.println("目录绝对路径:"+f2.getAbsolutePath());
System.out.println("目录构造路径:"+f2.getPath());
System.out.println("目录名称:"+f2.getName());
System.out.println("目录长度:"+f2.length());
}
}
输出结果:
文件绝对路径:d:\aaa\bbb.java
文件构造路径:d:\aaa\bbb.java
文件名称:bbb.java
文件长度:636字节
目录绝对路径:d:\aaa
目录构造路径:d:\aaa
目录名称:aaa
目录长度:4096
(3)判断方法
1)public boolean exists():判断系统中是否存在该File所表示的文件/文件夹;
2)public boolean isDirectory():判断该File对象所表示的是否是一个文件夹;
3)public boolean isFile():判断该File对象所表示的是否是一个文件;
public class FileIs {
public static void main(String[] args) {
File f = new File("d:\\aaa\\bbb.java");
File f2 = new File("d:\\aaa");
// 判断是否存在
System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
System.out.println("d:\\aaa 是否存在:"+f2.exists());
// 判断是文件还是目录
System.out.println("d:\\aaa 文件?:"+f2.isFile());
System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
}
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true
(4)创建和删除方法
1)public boolean createNewFile():创建一个已知目录下未存在文件;如果文件目录未知,抛出IO异常,如果文件存在则返回false;
2)public boolean mkdir():创建单级文件夹
3)public boolean mkdirs():创建多级文件夹
4)public boolean delete():删除文件夹或文件夹,文件夹中包含内容不能删除;
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
// 文件的创建
File f = new File("aaa.txt");
System.out.println("是否存在:"+f.exists()); // false
System.out.println("是否创建:"+f.createNewFile()); // true
System.out.println("是否存在:"+f.exists()); // true
// 目录的创建
File f2= new File("newDir");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir()); // true
System.out.println("是否存在:"+f2.exists());// true
// 创建多级目录
File f3= new File("newDira\\newDirb");
System.out.println(f3.mkdir());// false
File f4= new File("newDira\\newDirb");
System.out.println(f4.mkdirs());// true
// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
(5)目录的遍历
1)public String[] list():返回文件夹中的所有文件或文件夹字符串名称,如果不是目录或IO错误,返回null;
2)public File[] listFiles();返回文件夹中所有的文件或文件夹File对象,如果不是目录或IO错误,返回null;
4 文件过滤器
(1)文件过滤器是一个接口,有两个过滤器,java.io.FileFilter和java.io.FilenameFilter,两个接口方法功能相同,都只有一个文件过滤方法accept(),差别只是参数不同;该接口作用是将过滤方法传递给list()和listFiles()方法,使list和listFiles只包含符合条件的文件。
(2)过滤器使用
1)创建FileFilter实现类,实现accept方法,将其传递给list()/listFiles()使用
2)使用lambda表达式直接传递accept方法的实现
public class DiGuiDemo4 {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
printDir2(dir);
}
public static void printDir2(File dir) {
// 匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java")||pathname.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir2(file);
}
}
}
}
//使用Lambda表达式
public static void printDir3(File dir) {
// lambda的改写
File[] files = dir.listFiles(f ‐>{
return f.getName().endsWith(".java") || f.isDirectory();
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir3(file);
}
}
}