目录
概述
概述:java.io.file类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作
java把电脑中的文件和文件件封装为一个File类,我们可以使用File类对文件和文件夹进行操作(增删改查等)
注意File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
静态成员变量:
String pathSeparator:与系统有关的路径分隔符,为了方便,它被表示为一个字符串
在windows下是一个; linux下是一个:
pathSeparator就是一个空字符串""+pathSeparatorChar
所以pathSeparatorChar结果一样,只不过是char类型
String separator:文件名称分隔符
windows下是\ linux下是/
所以以后操作路径不能写死,要具有兼容性
separatorChar与上同理
路径:
绝对路径:以盘符开始的路径
相对路径:相对当前路径的路径
“./”:代表目前所在的目录。
“../”:代表上一层目录。
以”/”开头:代表根目录。
注意:
1、路径不区分大小写
2、路径中的文件名称分隔符windows使用/,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
File构造方法
/*
File(String pathname):通过将给定路径名字的字符串转换为抽象路径来创建一个新的File实例
路径可以是以文件结尾,也可以是以文件夹结尾
可以是绝对路径或相对路径
路径可以存在,也可以不真实存在
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
*/
File file=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src\\io_file\\a.txt");
//这里a.txt并不存在
System.out.println(file);//打印路径
/*
File (String parent,String child)根据parent路径名称和child路径名称字符串创建一个File实例
parent是父路径,child是子路径
好处:
父与子可以单独写,使用起来灵活,父子路径都可以变化
*/
String parent="D:\\";
String child="a.txt";
File file1=new File(parent,child);
System.out.println(file1);
/*
File(File parent,String child)根据parent抽象路径和child路径名称字符串创建一个新File实例
File parent父路径
String child子路径
好处:
父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象
*/
File parentF=new File("C:\\");
File file2=new File(parentF,"HelloWorld.java");
System.out.println(file2);
File类常用方法
public class FileMethod {
@Test
public void test01(){
/*
获取功能:
String getAbsolutePath():返回此File的绝对路径名字符串
String getPath():将此File转换为路径名字符串
String getName():返回由此File表示的文件或目录名称
long length():返回由此File表示的文件的长度
*/
//getAbsoluteFile方法测试
//绝对路径测试
File f1=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src\\io_file\\a.txt");
File absoluteFile = f1.getAbsoluteFile();
//相对路径测试
System.out.println(absoluteFile);
File f2=new File("a.txt");
System.out.println(f2.getAbsoluteFile());//a.txt返回当前目录的根目录
//getPath测试
//绝对路径,返回绝对路径
System.out.println(f1.getPath());
//相对路径,返回相对路径
System.out.println(f2.getPath());
//间接证明了toString方法调用的就是getPath方法
//测试getName方法,获取的就是构造方法传递路径的结尾部分
System.out.println(f1.getName());
System.out.println(f2.getName());
//测试length方法,返回的是构造方法中指定的文件的大小,以字节为单位
/*注意:
文件夹是没有大小概念的,不能获取文件件的大小,文件夹返回的也是0
如果构造方法中给出的路径不存在,那么返回0
*/
//这时我在上面的路径中创建了一个真正的a.txt
System.out.println(f1.length()+"字节");
System.out.println(f2.length()+"字节");//这个路径不存在
}
@Test
public void test02(){
/*
判断方法:
boolean exists():此File表示的文件或目录是否实际存在
boolean isDirectory:此File表示的是否为目录
boolean isFile:此File表示的是否为文件
*/
//exists方法测试
File f1=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src");
System.out.println(f1.exists());
//相对路径
File f2=new File("JavaHHHLevel.iml");
System.out.println(f2.exists());
//isDirectory和isFile测试,如果路径不存在都返回false
System.out.println(f1.isDirectory());
System.out.println(f2.isFile());
}
@Test
public void test03() throws IOException {
/*
创建删除功能的方法(返回的都是boolean值):
createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
true:文件不存在,创建文件,返回true
false:文件存在,不会创建,返回false
注意:
1、此方法只能创建文件,不能创建文件夹
2、创建文件的路径必须存在,否则会抛出异常
delete():删除由此File表示的文件或目录
true:文件/文件夹删除成功返回true
false:文件夹中有内容,不会删除返回false。构造方法中路径不存在false
注意:delete方法直接在硬盘删除不走回收站
mkdir():创建由此File表示的目录,只能创建单级文件夹
mkdirs():创建由此File表示的目录,包括任何必须但不存在的父目录
注意:创建文件夹的方法当路径不存在时不会抛出异常,只会返回false
*/
//createNewFile方法测试
File f1=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src\\1.txt");
System.out.println(f1.createNewFile());
File f2=new File("src\\2.txt");
System.out.println(f2.createNewFile());
//创建了两个txt文件
//delete方法测试
System.out.println(f1.delete());
System.out.println(f2.delete());
//两个txt文件被删除了
//mkdir方法测试
File f3=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src\\test_directory");
System.out.println(f3.mkdir());
//创建了一个名为test_directory的文件夹
File f4=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src\\more\\test_directory");
System.out.println( f4.mkdirs());
//创建了多重文件夹more\test_directory
}
}
@Test
public void test04(){
/*
遍历功能
String[] list():返回一个String数据,表示File目录中所有子文件或目录
File[] listFiles():返回一个File数组(封装成File对象),表示File目录中所有的子文件或目录
注意:
list方法和ListFiles方法遍历的是构造方法中给出的目录
如果目录不存在,会出现空指针异常
如果构造方法中的路径不是一个目录,也会出现空指针异常
可以获取到隐藏的文件夹
*/
File f1=new File("D:\\program testing\\javatest\\JavaHHHLevel\\src");
String[] list = f1.list();
for (String s : list) {
System.out.println(s);
}
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);
}
}
递归在FIle中的用法
直接递归:自己调用自己
间接递归:A调B,B调C,C再调用A
注意事项:
递归中要有一定限制,保证递归能够停下来,否则会栈内存溢出
递归次数不能过多,否则也会栈内存溢出
构造方法禁止递归
递归前提:当调用方法时,方法的主体不变,每次调用的参数不同,可以递归
溢出的原理
案例
/*递归打印多级目录*/
public class FileRecursion {
public static void main(String[] args) {
File file =new File("D:\\test_directory");
getAllFile(file);
}
public static void getAllFile(File file){
File[] files=file.listFiles();
for (File file1 : files) {
if (file1.isDirectory())
getAllFile(file1);
System.out.println(file1);
}
}
综合案例只打印java文件
public static void getAllFile(File file){
File[] files=file.listFiles();
for (File file1 : files) {
if (file1.isDirectory())
getAllFile(file1);
//这里可以使用getPath、toString等方法
if (file1.getName().toLowerCase().endsWith("java"))
System.out.println(file1);
}
}
文件过滤器
在ListFiles的重载方法中:
ListFiles(FileFilter filter)
ListFiles(FilenameFilter filter)
传递的就是过滤器
java.io.FileFilter接口:用于抽象路径名的过滤器
作用:过滤文件(File)
抽象方法:用来过滤文件的方法
boolean accept(File pathname)测试指定抽象路径是否应该包含某个路径名列表中
参数:
File pathname:使用listFile方法遍历目录,得到的每一个文件对象
java.io.FilenameFilter接口:实现此接口的实现类可以用于过滤文件名
抽象方法:用来过滤文件的方法
boolean accept(File dir,String name):测试指定文件是否包含在某一文件列表中
参数:File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意:两个过滤器需要自己写实现类,在方法中自己定义过滤的规则
listFiles方法一共做了3件事
1、对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹-->封装为File对象
2、调用参数传递的过滤器方法accept
3、把遍历得到的每一个File对象,传递到accept方法的参数pathname
accept:返回true则将File对象保存到File数组中
false则不会保存
实例:
/*过滤器*/
public class Filter {
//懒得外面再写一个类了,实现过滤器的内部类
public static class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory())return true;
return pathname.getName().toLowerCase().endsWith(".java");
}
}
public static void main(String[] args) {
getAllFile(new File("D:\\test_directory"));
}
public static void getAllFile(File file){
//lambda写法
//FileFilter
/* File[] files=file.listFiles((pathname)-> pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java"));*/
//FilenameFilter
File[] files= file.listFiles((dir, name) -> new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".java"));
for (File file1 : files) {
if (file1.isDirectory())
getAllFile(file1);
System.out.println(file1);
}
}
}
结果都一样: