File类
概述
java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
Filel类是一个与操作系统无关的类,任何操作系统都可以使用这个类的方法
分隔符方法
Static String pathSeparator 与系统有关的路径分隔符,为了方便它被表示为一个字符串
Static char pathSeparator 与系统有关的路径分隔符
Static String separator 与系统有关的默认名称分隔符,为了方便它被表示为一个字符串
Static char separator 与系统有关的默认名称分隔符
操作路径(路径不能写死了):
C:\JAVA\a\a.txt windows
C:/JAVA/a/a.txt linux
"C:+File.separator+“JAVA”+File.separator+“a”+File.separator+"a.txt "
路径:
绝对路径:是一个完整的路径
以盘符(c:,d:)开始的路径
C:\JAVA\a\a.txt
相对路径:是一个简化的路径
相对是指相对于当前项目的根目录,路径可以简化书写
C:\JAVA\a\a.txt–>简化为a.txt
注意:
1、路径是不区分大小写
2、路径中的文件名称分隔符windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
构造方法
package FileTest;
import java.io.File;
/*File构造方法*/
public class FileConstructMethod {
public static void main(String[] args) {
//1、通过文件名字符串转换为抽象路径名来创建新的对象
String pathName ="c:\\aaa.txt";
File file = new File(pathName);
String pathName1 ="c:\\aaa\\bbb.txt";
File file1 = new File(pathName);
//2、通过通过父路径和子路径字符串
File fileParent = new File("D://aaa");
String child ="bbb.txt";
File file2 = new File(fileParent,child);
System.out.println(file2);
//3、通过父级File和子级字符串
File parentDir = new File("D://AAA");
String child1 ="BBB.txt";
File file3 = new File(parentDir,child1);
System.out.println(file3);
}
}
常用方法
判断
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表示的目录,包括任何必需但不存在的父目录。
package FileTest;
import java.io.File;
import java.io.IOException;
public class FileMethodsTest {
public static void main(String[] args) throws IOException {
//判断
File f1= new File("d:\\a\\a.java");
File f2= new File("d:\\b");
//判断是否存在
System.out.println(f1.exists());
System.out.println(f1.exists());
//判断是文件还是目录
System.out.println(f2.isFile());
System.out.println(f2.isDirectory());
//创建删除
//文件的创建
File f3 =new File("aaa.txt");
System.out.println(f3.exists());
System.out.println(f3.createNewFile());
System.out.println(f3.exists());
//目录的创建
File f4 = new File("newDir");
System.out.println(f4.exists());
System.out.println(f4.mkdir());
System.out.println(f4.exists());
//创建多级目录
File f5 = new File("newDira\\newDifb");
System.out.println(f5.mkdir());
System.out.println(f5.mkdirs());
//文件的删除及目录的删除(delete()方法直接在硬盘中删除,不走回收站,删除需谨慎)
System.out.println(f3.delete());
System.out.println(f5.delete());
}
}
目录的遍历
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
package FileTest;
import java.io.File;
public class FileBianli {
public static void main(String[] args) {
File dir = new File("D:\\DingDing");
//获取当前目录文件及文件夹名称
String[] names = dir.list();
for (String name:names){
System.out.println(name);
}
//获取当前文件及文件夹对象,返回的是一个File数组
//ListFiles方法的File对象,表示的是实际存在的目录,否则返回null无法遍历
File[] files = dir.listFiles();
for (File file:files){
System.out.println(file);
}
}
}
递归
概述
递归:指在当前方法内调用自己的这种现象。
递归的分类:
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
构造方法,禁止递归
递归使用前提:
当调用方法色时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
递归求和
需求:计算1 ~ n的和
package DiGuiTest;
/*
练习:使用递归计算1+n的和
分析:
先定义一个方法,使用递归计算1+n的和
1+2+3+...+n
等效于n+(n-1)+(n-2)+...+1
已知:
最大值:n
最小值:1
使用递归必须明确:
1、递归的结束条件
获取到1时结束
2、递归的目的:
获取下一个被加的数字(n-1)
*/
public class SumTest {
public static void main(String[] args) {
int num = 5;
int result =getSum(num);
System.out.println(result);
}
private static int getSum(int num) {
if(num==1){
return 1;
}
return num+getSum(num-1);
}
}
递归打印多级目录
分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实
现。
package DiGuiTest;
import java.io.File;
public class GetFiles {
public static void main(String[] args) {
File dir = new File("F:\\TestJava");
getAllFiles(dir);
}
private static void getAllFiles(File dir) {
File[] files=dir.listFiles();
for (File file:files){
//对遍历得到的File对象进行判断,判断是否是文件夹
//getAllFiles()方法就是传递文件夹,遍历文件夹的方法
//所以直接调用getAllFiles()方法即可,递归(自己调自己)
if (file.isDirectory()){
getAllFiles(file);
}else {
//file是一个文件直接打印即可
System.out.println(file);
}
}
}
}
综合案例
文件搜索
package DiGuiTest;
import java.io.File;
public class GetDirectFile {
public static void main(String[] args) {
File dir = new File("F:\\TestJava");
getDirect(dir);
}
private static void getDirect(File dir) {
File[] files = dir.listFiles();
for (File file:files){
if (file.isFile()){
//是文件,判断文件名并输出
if (file.getName().endsWith(".java")){
System.out.println(file);
}
}else {
//是目录,继续遍历形成递归
getDirect(file);
}
}
}
}
文件过滤器优化
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
-
File[] listFiles(FileFilter filter)
**java.io.FileFilter接口:**用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:
File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象 -
File[] listFiles(FilenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名。
作用:用于过滤文件名称
**抽象方法:**用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
参数:
File dir:构造方法中传递的被遍历的目录
**String name:**使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
普通方法
package DiGuiTest;
import java.io.File;
public class FileFilterImpl implements java.io.FileFilter {
@Override
public boolean accept(File pathname) {
/*过滤规则:
在accept方法中判断File对象是否以".Java"结尾
是则返回true
不是则返回false
如果pathname是一个文件夹,返回true 继续遍历这个文件夹
*/
if (pathname.isDirectory()){
return true;
}else
return pathname.getName().toString().toLowerCase().endsWith(".java");
}
}
package DiGuiTest;
import java.io.File;
public class FileFilterDemo {
public static void main(String[] args) {
File dir = new File("F:\\TestJava");
getAllFiles(dir);
}
private static void getAllFiles(File file) {
File[] files = file.listFiles(new FileFilterImpl());
for (File pathFile:files){
if (pathFile.isDirectory()){
getAllFiles(pathFile);
}else {
System.out.println(pathFile);
}
}
}
}
匿名内部类及Lambda表达式
package DiGuiTest;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class FileFilterDemo01 {
public static void main(String[] args) {
File dir = new File("F:\\TestJava");
getAllPathFiles(dir);
}
private static void getAllPathFiles(File file) {
//传递过滤器对象--FileFilter,使用匿名内部类
/*
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
//过滤规则,pathname是文件夹或者是.java结尾的文件返回true
return pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java");
}
});
*/
//传递过滤器对象--FilenameFilter,使用匿名内部类
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java");
}
});
/* //使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)--FileFilter
File[] files1 = file.listFiles(pathname->{
return pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java");
});
//进一步优化
File[] files2 = file.listFiles(pathname->
pathname.isDirectory() || pathname.getName().toString().toLowerCase().endsWith(".java"));*/
//使用Lambda表达式优化匿名内部类(接口中只有一个抽象方法)--FileFilter
File[] files1 = file.listFiles((File dir, String name)->{
return dir.isDirectory() || name.toLowerCase().endsWith(".java");
});
//进一步优化
File[] files2 = file.listFiles((dir, name)->
dir.isDirectory() || name.toLowerCase().endsWith(".java")
);
for (File pathFile : files) {
if (pathFile.isDirectory()) {
getAllPathFiles(pathFile);
} else {
System.out.println(pathFile);
}
}
}
}