一 File类
java.io.File类:文件和目录路径名称的抽象表示形式
java把电脑中的文件和文件夹(目录)封装为一个File类,我们可以使用File类对文件和文件夹进行操作
File类是一个与系统无关的类,任何操作系统都可以使用这个类中的方法
重点:三个单词 File:文件 directory:文件夹/目录 path:路径
1.1 File类的静态变量
; 路径分隔符 Lunux是 :
操作路径 : 不能写死了 ,可能在不同操作系统进行操作,可以用 “c:File.separator”方式
1.2 绝对路径和相对路径
绝对路径:是一个完整路径
相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录,可以简化书写
注意:
1,路径是不区分大小写的
2,路径中的文件名windows使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠。
1.3 File类的构造方法
public File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。String pathname:字符串的路径名称,有没有无所谓,可以是文件或者文件夹
public File(String parent, String child)
从父路径名字符串和子路径名字符串创建新的 File实例。参数:把路径分成了量部分 (String parent 父路径 String child 子路径)
好处:父路径和子路径,可以单独书写,用起来灵活,都可以变化
父路径是File类型,可以使用File的方法操作路径
public File(File parent, String child)
从父抽象路径名和子路径名字符串创建新的 File实例。
1.4 File中常用方法
1.4.1 获取功能的方法
public String getAbsolutePath() :返回此File的绝对路径名字符串。
public String getPath() :将此File转换为路径名字符串(是什么样就是什么)。
public String getName() :返回由此File表示的文件或目录的名称(传递路径的结尾部分,文件/文件夹)。
public long length() :返回由此File表示的文件的长度(以字节为单位,文件夹大小没有大小概念,不能获取文件夹长度。没有文件则返回0)。
1.4.2 判断功能的方法
public boolean exists() :此File表示的文件或目录是否实际存在。存在:true
public boolean isDirectory() :此File表示的是否为目录。判断构造方法中给定的路径是否以文件夹结尾
public boolean isFile() :此File表示的是否为文件。判断构造方法中给定的路径是否以文件结尾
注意事项:
电脑的硬盘中只有文件/文件夹,两个方法是互斥的。
这两个方法适用前提,路径是存在的
1.4.3 创建和删除功能的方法
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
注意:1,只能创建文件,不能创建文件夹。
2,创建文件的路径必须存在,否则会抛出异常。
返回boolean值
public boolean delete() :删除由此File表示的文件或目录。
true:文件/文件夹删除成功,返回true
false:文件夹中有内容,删除不成功,返回false;路径不存在返回false。
public boolean mkdir() :创建由此File表示的目录。只能创建单级空文件夹。
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。能创建单级空文件夹,也能创建多级空文件夹(只能创建文件夹)
1.5 File类的遍历
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。隐藏也可以获取
注意:list方法和listFile方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录的路径不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
注意:list方法和listFile方法遍历的是构造方法中给出的目录,获取目录中所有的文件夹/文件,把文件/文件夹封装为File对象,多个File对象存储到File数组中
如果构造方法中给出的目录的路径不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异常
二 递归
2.1 概述
递归:指在当前方法内调用自己的这种现象。
递归的分类:
递归分为两种,直接递归和间接递归。
直接递归称为方法自身调用自己。
间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
构造方法,禁止递归
递归的使用前提:
1,当调用方法的时候,方法的主体不变,每次调用方法的参数不同。
2.2 递归求n-1求和
public class DiGuTest {
public static void main(String[] args) {
int he = sum(5);
System.out.println(he);
}
public static int sum(int n){
if(n == 1){
return 1; // 等于1时停止,返回1
}
return n+sum(n-1);
}
}
注意:使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法导致在内存中有多个sum方法(频繁创建方法,调用方法,销毁方法,效率低下)
2.3 递归求阶乘
public class DiGuiTest01 {
public static void main(String[] args) {
int re = jiechen (3);
System.out.println(re);
}
public static int jiechen (int n){
if(n == 1){
return 1;
}
return n*jiechen(n-1);
}
}
2.4 递归打印多级目录
public class DiGuiTest02 {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
public static void getAllFile (File f){
File[] files = f.listFiles();// 创建File数组
for (File k:files) { //增强for循环遍历
System.out.println(k);
}
}
}
这个代码得到的只是abc目录下的文件和文件夹,不包含子文件夹
解决:先对遍历得到的file对象进行判断,看是否是文件夹。
如果是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹,遍历文件夹的方法,所以直接调用这个方法即可就是递归
改进:
public class DiGuiTest02 {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
public static void getAllFile(File f) {
System.out.println(f); // 打印文件夹,调用时可以把文件夹打印出来
File[] files = f.listFiles();
for (File k : files) {
if (k.isDirectory()) { //先判断是不是文件夹
getAllFile(k);
} else {
System.out.println(k);
}
}
}
}
三 综合案例
3.1 文件搜索
搜索D:\aaa 目录中的.java 文件。
把File对象f转成字符串
public class DiGuiTest02 {
public static void main(String[] args) {
File file = new File("c:\\abc");
getAllFile(file);
}
public static void getAllFile(File f) {
System.out.println(f); // 打印文件夹,调用时可以把文件夹打印出来
File[] files = f.listFiles();
for (File k : files) {
if (k.isDirectory()) { //先判断是不是文件夹
getAllFile(k);
} else {
String s = k.toString(); //将路径转成字符串
boolean b = s.endsWith("java");// 判断是否是java文件
if(b){ //是则打印出
System.out.println(k);
}
}
}
}
3.2 文件过滤器
java.io.FileFilter 是一个接口,是File的过滤器。 该接口的对象可以传递给File类的
File[ ] listFiles(FileFilter filter) 作用:用来过滤文件(File 对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。 Flie pathname:使用ListFiles方法遍历目录,得到每一个文件对象
File[ ] ListFiles(FileNameFilter filter):实现此接口的实现类实例可用于过滤文件名。
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir ,String name)
参数:File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,得到每一个文件对象
//创建过滤器的实现类
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
return true;
}
return pathname.getName().toLowerCase().endsWith("java");
}
}
注意:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
3.3 Lamda优化
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);
}
}
}
本文详细介绍了Java中的File类,包括其静态变量、绝对路径与相对路径的概念,以及构造方法和常用方法如获取路径、判断文件/目录、创建与删除等。此外,还探讨了递归的基本概念,通过递归实现文件和目录的遍历,并展示了如何使用递归在特定目录下查找.java文件。最后,提到了FileFilter接口在文件过滤中的应用,以及使用Lambda表达式进行优化。
714

被折叠的 条评论
为什么被折叠?



