File类
概述
java.io.File
类:文件和路径名的抽象表现形式- java把电脑中的文件和文件夹(目录)封装为了一个File类,可以使用File类对文件和文件夹进行操作
- File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
- file 文件 directory目录 path路径
file类中的静态成员变量
static String pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar
与系统有关的路径分隔符。
static String separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
static char separatorChar
与系统有关的默认名称分隔符。
注意:操作路径不能写死
C:\develop\a.txt windows
~/develop/a.txt Linux
"C:"+File.separator+"develop"+File.separator+"a.txt" Linux\Windows
String pathSeparator=File.pathSeparator;
System.out.println(pathSeparator);//路径分隔符 windows:分号 Linux:冒号
如:C:\a.txt;D:\b.txt 两个路径之间分开
String separator=File.separator;
System.out.println(separator);//文件名分隔符 windows:反斜杠\ Linux:正斜杠/
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
C:\demo\a.txt
- 相对路径:相对于当前目录的根目录
如果使用当前目录的根目录,可以简化书写
C:\java_project\a.txt -->简化为 a.txt
- 注意:
- 路径不区分大小写
- 路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
File类构造方法
- public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
- public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
- public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
注意:创建File对象,只是把字符串路径封装成file对象,不考虑路径的真假情况
File类中常用方法
获取功能的方法
- public String getAbsolutePath() :返回此File的绝对路径名字符串。 (获取绝对路径)
- public String getPath() :将此File转换为路径名字符串。(获取构造方法中传递的路径)
- public String getName() :返回由此File表示的文件或目录的名称。 (获取构造方法传递路径的结尾部分)
- public long length() :返回由此File表示的文件的长度。 (文件夹是没有大小的,不能获取文件夹的大小,返回0值)(如果构造方法中给出的路径不存在,返回0值)
判断功能的方法
- public boolean exists() :此File表示的文件或目录是否实际存在。
- public boolean isDirectory() :此File表示的是否为目录。
- public boolean isFile() :此File表示的是否为文件。
创建删除功能的方法
- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
- 此方法只能创建文件,不能创建文件夹
- 创建文件的路径必须存在,否则会抛出异常
- public boolean delete() :删除由此File表示的文件或目录。
- public boolean mkdir() :创建由此File表示的目录。 (创建单级文件夹)
- public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(既可创建单级文件夹,也可创建多级文件夹)
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\\ccc.txt");
System.out.println(f4.mkdirs());// true 不要被名称迷惑,看具体类型,ccc.txt是一个目录
// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
注意:delete方法,如果此File表示目录,则目录必须为空才能删除
目录的遍历
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
注意:
- list和listFiles方法遍历的是构造方法中给出的目录;
- 如果构造方法中给出的目录路径不存在,会抛出空指针异常;
- 如果构造方法中给出的路径不是一个目录,也会抛出空指针异常;
递归
- 递归的分类: 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 注意事项
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
/*
需求:递归多级目录,查找.java文件
C:\abc
C:\abc\abc.txt
c:\abc\abc.java
c:\abc\a
c:\abc\a\a.java
c:\abc\a\a.jpg
c:\abc\b
c:\abc\b\b.java
c:\abc\b\b.jpg
*/
public class DiGuiMuLu {
public static void main(String[] args) {
File file=new File("c:\\abc");
digui(file);
}
public static void digui(File file){
File[] list=file.listFiles();
if(list!=null){
for (File s:list) {
if(s.isFile()) {
//是文件判断文件名,输出java文件
if(s.getName().endsWith(".java")){
System.out.println(s);
}
}else {
//是目录,则继续递归
digui(s);
}
}
}
}
}
文件过滤器
- 在File类中有两个和ListFiles重载的方法,方法的参数传递就是过滤器
File[] listFiles(FileFilter filter)
1.
java.io.FileFilter
是一个接口,是File的过滤器。
2.抽象方法:用来过滤文件的方法
boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。
3.参数File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象,pathname是文件或目录的绝对路径
File[] listFiles(FilenameFilter filter)
java.io.FileNameFilter
实现此接口的类实例可用于过滤器文件名- 抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) :测试指定文件是否应该包含在某一文件列表中。- File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,得到的每一个文件对象,name仅仅是文件或目录的名称,不是绝对路径
- listFiles[]一共做了3件事情
- listfiles方法会对构造方法中传递的目录进行遍历,获取每一个文件/文件夹–>封装成File对象
- listfiles方法会调用参数的传递的过滤器中的方法accept
- listfiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname
- 过滤规则:
在accept方法中返回的是一个布尔值
true:把传递过去的File对象保存在File数组中
false:不会把传递过去的File对象保存在File数组中
/*
递归目录中的所有.java文件
*/
public class DiGuiDemo {
public static void main(String[] args) {
File file=new File("c:\\abc");
digui(file);
}
public static void digui(File file){
//使用FileFilter过滤器
File[] files=file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
System.out.println(pathname);//c:\abc\a
return pathname.getName().endsWith(".java")||pathname.isDirectory();//保存java文件和目录
}
});
//使用FilenameFilter
/*File[] files1=file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//System.out.println(name);//a
return (new File(dir,name)).isDirectory()||name.endsWith(".java");
}
});*/
//使用Lambda表达式
File[] files=file.listFiles(pathname->pathname.getName().endsWith(".java")||pathname.isDirectory());
File[] files1=file.listFiles((dir,name)->(new File(dir,name)).isDirectory()||name.endsWith(".java"));
//遍历子目录
for (File f: files) {
if(f.isFile()){
System.out.println(f.getAbsoluteFile());
}else{
digui(f);
}
}
}
}