【File类、文件过滤器、递归】
File类
概述
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
1.2 构造方法
-
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 -
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。 -
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。 -
构造举例,代码如下:
import java.io.File;
/*
* File 类的构造方法
* 三种重载形式
*/
public class FileDemo1 {
public static void main(String[] args) {
function();
}
/*
* File(String pathname)
* 传递路径名:可以写到文件夹,可以写到一个文件
* C:\\abc C:\\abc\\Demo.java
* 将路径封装File类型对象
*/
public static void function() {
File file = new File("d:\\eclipse");
System.out.println(file);
}
/*
* File(File parent,String child)
* 传递路径,传递File类型父路径,字符串子路径
* 好处:父路径是File类型,父路径可以直接调用File类的方法
*/
private static void function2() {
File parent = new File("d:");
File file = new File(parent , "eclipse");
System.out.println(file);
}
/*
* File(String parent,String child)
* 传递路径,传递字符串父路径,字符串子路径
* 好处:单独操作父路径和子路径
*/
public static void function_1() {
File file = new File("d:","eclipse");
System.out.println(file);
}
}
小贴士:
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
常用方法
获取功能的方法
public class FileDemo3 {
public static void main(String[] args) {
function_3();
}
/*
* File类的获取功能
* String getName();
* 返回路径中表示的文件或者文件夹名
* 获取路径中最后部分的名字
*/
public static void function() {
File file = new File("d:\\eclipse\\eclipse.exe");
String name = file.getName();
System.out.println(name);
}
/*
* File类的获取功能
* String getParent() 返回String对象
* File getParentFile() 返回File对象
* 获取父路径
*/
public static void function_3() {
File file = new File("d:\\eclipse\\eclipse.exe");
File parent = file.getParentFile();
System.out.println(parent);
}
/*
* File类获取功能
* String getAbsolutePath() 返回String对象
* File getAbsolutePath() 返回File对象
* 获取绝对路径
*
*/
public static void function2() {
File file = new File("src");//写的是一个相对路径,获取的是绝对位置工程根目录
File absolute = file.getAbsoluteFile();
System.out.println(absolute);
}
/*
* File 类获取功能
* long length()
* 返回路径中表示的文件的字节数
*/
public static void function1() {
File file = new File("d:\\eclipse\\eclipse.exe");
long length = file.length();
System.out.println(length);
}
}
判断功能的方法
public boolean exists()
:此File表示的文件或目录是否实际存在。public boolean isDirectory()
:此File表示的是否为目录。public boolean isFile()
:此File表示的是否为文件。
方法演示,代码如下:
/*
* File类的判断功能
*/
public class FileDemo4 {
public static void main(String[] args) {
function1();
}
/*
* File判断功能
* boolean isDirectory();
* 判断File构造方法中封装的路径是不是文件夹
* 如果是文件夹,返回true,不是文件返回false
*
* boolean isFile()
* 判断File构造方法中封装的路径是不是文件
*/
public static void function1() {
File file = new File("d:\\eclipse");
if(file.exists()) {
boolean b = file.isDirectory();
System.out.println(b);
}
}
/*
* File判断功能
* boolean exists()
* 判断File构造方法中封装路径是否存在
* 存在返回true 不存在返回false
*/
public static void function() {
File file = new File("d:\\eclipse\\eclipse.exe");
boolean b = file.exists();
System.out.println(b);
}
}
创建删除功能的方法
方法演示,代码如下:
import java.io.File;
import java.io.IOException;
/*
* File类的创建和删除功能
* 文件或者目录
*/
public class FileDemo2 {
public static void main(String[] args) throws IOException {
function2();
}
/*
* File创建文件的功能
* boolean createNewFile()
* 创建文件路径和文件名,在File构造方法给出
* 文件已经存在了,不再创建
*/
public static void function() throws IOException {
File file = new File("d:\\a.txt");
boolean b = file.createNewFile();
System.out.println(b);
}
/*
* File类的删除功能
* boolean delete()
* 删除的文件或者是文件夹,在File类的构造方法中给出
* 删除成功返回true,删除失败返回false
*/
public static void function2() {
File file = new File("d:\\a.txt");
boolean b = file.delete();
System.out.println(b);
}
/*
* File创建文件夹功能
* boolean mkdirs() 创建多层文件夹
* 创建的路径也在File构造方法中给出
* 文件夹已经存在了,不再创建
*/
public static void function1() {
File file = new File("d:\\abc\\b\\c");
boolean b = file.mkdirs();
System.out.println(b);
}
}
API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。
目录的遍历
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。 -
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
import java.io.File;
public class FileDemo {
public static void main(String[] args) {
function1();
}
/*
* File类的获取功能
* File[] listFiles()
* 获取到,File构造方法中封装的路径中的文件和文件夹(遍历目录)
* 返回的是目录或者文件的全路径
*/
public static void function1() {
File file = new File("d:");
File[] fileArr = file.listFiles();
for(File f : fileArr) {
System.out.println(f);
}
}
/*
* File类的获取功能
* String[] list()
* 获取到,File构造方法中封装的路径中的文件和文件夹(遍历目录)
* 返回只有名字
*/
public static void function() {
File file = new File("d:");
String[] strArr = file.list();
System.out.println(strArr.length);
for(String str : strArr) {
System.out.println(str);
}
}
}
小贴士:
调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
文件过滤器
java.io.FileFilter
是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法。
boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中,符合则返回true。
分析:
- 接口作为参数,需要传递子类对象,重写其中方法。
accept
方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:- 要么是.java文件。
- 要么是目录,用于继续遍历。
- 通过过滤器的作用,
listFiles(FileFilter)
返回的数组元素中,子文件对象都是符合条件的,可以直接打印。
代码实现:
import java.io.File;
/*
* File类的获取,文件获取过滤器
* 遍历目录的时候可以根据需要,只获取满足条件的文件
* 遍历目录方法 listFiles()重载形式
* listFiles(FileFilter filter)接口类型
* 传递FileFilter接口的实现类
* 自定义FileFilter接口实现类,重写抽象方法
* 接口实现类对象作为参数传递到遍历方法listFiles
*
*/
public class FileDemo1 {
public static void main(String[] args) {
File file = new File("D:\\Demo");
File[] fileArr = file.listFiles(new MyFilter());
for(File f : fileArr) {
System.out.println(f);
}
}
}
import java.io.File;
import java.io.FileFilter;
/*
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyFilter implements FileFilter{
public boolean accept(File pathname) {
/*
* pathname 接受到的也是文件的全路径
* c:\\demo\\1.txt
* 对路径进行判断,如果是java文件,返回true,不是java文件,返回false
* 文件的后缀结尾是.java
*/
//String name = pathname.getName();
return pathname.getName().endsWith(".java");
}
}
递归
概述
-
递归:指在当前方法内调用自己的这种现象。
-
递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
-
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
/*
* 方法的递归调用
* 方法自己调用自己
* 适合于,方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
* 注意:
* 递归一定要有出口, 必须可以让程序停下
* 递归次数不能过多
* 构造方法,禁止递归
*/
public class DiGuiDemo {
public static void main(String[] args) {
int sum = getSum(3);
System.out.println(sum);
System.out.println(getJieCheng(5));
System.out.println(getFBNQ(12));
}
/*
* 方法递归,计算斐波那契数列
*
*/
public static int getFBNQ(int month){
if( month == 1)
return 1;
if( month == 2)
return 1;
return getFBNQ(month-1)+getFBNQ(month-2);
}
/*
* 计算阶乘 5!
* 5*4*3*2*1
*/
public static int getJieCheng(int n){
if ( n == 1)
return 1;
return n * getJieCheng(n-1);
}
/*
* 计算 1+2+3+100和 = 5050
* 计算规律:
* n+(n-1)+(n-2)
* 100+(100-1)+(99-1)+...1
*/
public static int getSum(int n){
if( n == 1)
return 1;
return n + getSum(n-1);
}
}
递归打印多级目录
代码实现:
import java.io.File;
/*
* 对一个目录目录下的所有内容,进行完整的遍历
* 编程技巧,方法的递归调用,调用自己
*/
public class FileDemo {
public static void main(String[] args) {
File dir = new File("D:\\Demo");
getAllDir(dir);
}
/*
* 定义方法,实现目录的全遍历
*/
public static void getAllDir(File dir) {
System.out.println(dir);
//调用方法listFiles()对目录,dir进行遍历
File[] fileArr = dir.listFiles();
for(File f : fileArr) {
//判断f表示的路径是不是文件夹
if(f.isDirectory()) {
//是一个目录,就要去遍历这个目录
//本方法,getAllDir,就是给个目录去遍历
//继续调用getAllDir,传递其他目录
getAllDir(f);
}else {
System.out.println(f);
}
}
}
}
综合案例
文件搜索
搜索D:\Demo
目录中的.java
文件。
代码实现:
/*
* 遍历目录,获取目录下的所有.java文件
* 遍历多级目录,方法递归实现
* 遍历的过程中,使用过滤器
*/
import java.io.File;
public class FileDemo1 {
public static void main(String[] args) {
File dir = new File("D:\\Demo");
getAllJava(dir);
}
/*
* 定义方法,实现遍历指定目录
* 获取目录中所有.java文件
*/
public static void getAllJava(File dir) {
//调用File对象方法listFiles()获取,加入过滤器
File[] fileArr = dir.listFiles(new MyJavaFilter());
for(File f : fileArr) {
//判断f表示的路径是不是文件夹
if(f.isDirectory()) {
//递归进入文件夹遍历
getAllJava(f);
} else {
System.out.println(f);
}
}
}
}
/*
* 自定义过滤器
* 实现FileFilter接口,重写抽象方法
*/
public class MyJavaFilter implements FileFilter{
@Override
public boolean accept(File pathname) {
//判断是目录,不需要比对后缀,直接返回true
if(pathname.isDirectory()) {
return true;
}else {
return pathname.getName().toLowerCase().endsWith(".java");
}
}
}
运行结果: