flie类,递归
java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建,查找和删除等操作。
构造方法
public File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。public File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。- 构造举例:
// 文件路径名
String pathname = "/Users/heroma/IdeaProjects/demo_object/aaa.tex";
File file1 = new File(pathname);
// 文件路径名
String pathname2 = "/Users/heroma/IdeaProjects/demo_object/bbb.txt";
File file2 = new File(pathname2);
// 通过父路径和子路径字符串
String parent = "/Users/heroma/IdeaProjects/demo_object";
String child = "bbb.txt";
File file3 = new File(parent, child);
// 通过父级File对象和子路径字符串
File parentDir = new File("/Users/heroma/IdeaProjects/demo_object/aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);
一个File对象代表磁盘中实际存在的一个文件或者目录。
无论该路径下是否存在文件和目录,都不影响File对象的创建
常用方法
获取功能的方法
public String getAbsolutePath():返回此File的绝对路径名字符串public String getPath():将此File转化为路径名字符串public String getName():返回此File表示的文件或目录的名称public long length():返回由此File表示的文件长度
代码演示:
package demo.file;
import java.io.File;
/*
- `public String getAbsolutePath()`:返回此File的绝对路径名字符串
- `public String getPath()`:将此File转化为路径名字符串
- `public String getName()`:返回此File表示的文件或目录的名称
- `public long length()`:返回由此File表示的文件长度
*/
public class FileGet {
public static void main(String[] args) {
File file = new File("/Users/heroma/IdeaProjects/demo_object/pom.xml");
System.out.println("文件的绝对路径:"+file.getAbsolutePath());
System.out.println("文件的构造路径:"+file.getPath());
System.out.println("文件名称:"+file.getName());
System.out.println("文件的字节码长度:"+file.length());
File file1 = new File("/Users/heroma/IdeaProjects/demo_object");
System.out.println("文件的绝对路径:"+file1.getAbsolutePath());
System.out.println("文件的构造路径:"+file1.getPath());
System.out.println("文件名称:"+file1.getName());
System.out.println("文件的字节码长度:"+file1.length());
}
}
输出:
文件的绝对路径:/Users/heroma/IdeaProjects/demo_object/pom.xml
文件的构造路径:/Users/heroma/IdeaProjects/demo_object/pom.xml
文件名称:pom.xml
文件的字节码长度:426
文件的绝对路径:/Users/heroma/IdeaProjects/demo_object
文件的构造路径:/Users/heroma/IdeaProjects/demo_object
文件名称:demo_object
文件的字节码长度:224
length(),表示文件的长度。但是File对象表示目录,则返回值未指定。
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用
package demo.file;
import java.io.File;
public class FilePath {
public static void main(String[] args) {
File file = new File("/Users/heroma/IdeaProjects/demo_object/pom.xml");
System.out.println(file.getAbsolutePath());
File file1 = new File("pom.xml");
System.out.println(file1.getAbsolutePath());
}
}
输出:
/Users/heroma/IdeaProjects/demo_object/pom.xml
/Users/heroma/IdeaProjects/demo_object/pom.xml
判断功能的方法
public boolean exists():此File表示的文件或目录是否正是存在。public boolean isDirectory():此File表示的是否为目录。public boolean IsFile():此File表示的是否为文件。
方法演示,代码如下:
package demo.file;
import java.io.File;
public class FileIs {
public static void main(String[] args) {
File file = new File("/Users/heroma/IdeaProjects/demo_object/pom.xml");
File file1 = new File("/Users/heroma/IdeaProjects/demo_object");
System.out.println(file.exists());
System.out.println(file1.exists());
System.out.println(file1.isDirectory());
System.out.println(file1.isFile());
}
}
输出:
true
true
true
false
创建删除功能的方法
-
public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 -
public boolean delete():删除由此File表示的文件或目录。 -
public boolean mkdir():创建由此File表示的目录。 -
public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。
方法演示,代码如下:
package demo.file;
import java.io.File;
import java.io.IOException;
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
File file = new File("a.txt");
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
File newDir = new File("newDir");
System.out.println(newDir.exists());
System.out.println(newDir.mkdir());
System.out.println(newDir.exists());
File file1 = new File("newDir/newDira");
System.out.println(file1.mkdir());
File file2 = new File("newDir/newDirb");
System.out.println(file2.mkdirs());
System.out.println(file.delete());
System.out.println(newDir.delete());
System.out.println(file2.delete());
}
}
API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。
目录的遍历
public String[] list():返回一个String数组,表示该File目录中所有自文件或目录。public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录。
package demo.file;
import java.io.File;
public class FileList {
public static void main(String[] args) {
File file = new File("/Users/heroma/IdeaProjects/demo_object");
//获取当前目录下的文件以及文件夹的名称。
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
System.out.println("---------------------------------------------------------");
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1);
}
}
}
调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
递归
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类:
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
- 注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
- 构造方法禁止递归
递归累计求和
计算1~n的和
分析:num的累计和= num + (num-1)的累计和,所以可以把累计的操作定义一个方法,递归调用。
实现代码:
package demo.digui;
public class DiGuiDemo {
public static void main(String[] args) {
int num = 3;
System.out.println(getSum(num));
}
public static int getSum(int num){
if(num == 1){
return 1;
}
return num + getSum(num -1);
}
}
递归一定要有条件限定,保证递归能够停止下来,次数不能太多,否则会发生栈内存溢出。
递归求阶乘
-
阶乘:所有小于以及小于等于该数的正整数的积
n的阶乘:n!= n*(n-1)*...*3*2*1 -
与累加相似,只不过这里换成了乘法运算。
推理得出:n!= n*(n-1)!
代码实现:
package demo.digui;
public class DiGuiDemo {
public static void main(String[] args) {
int num = 3;
System.out.println(getSum(num));
int n =5;
System.out.println(n + "的阶乘:" + getValue(n));
}
public static int getSum(int num){
if(num == 1){
return 1;
}
return num + getSum(num -1);
}
/*
通过递归实现
参数类型为int
返回类型为int
*/
public static int getValue(int n){
//1的阶乘为1
if(n == 1){
return 1;
}
/*
n不为1时,n! = n*(n-1)!
调用方法getValue
*/
return n * getValue(n-1);
}
}
递归打印多级目录
-
分析:多级目录的打印,就是当前目录的嵌套。遍历之前,无从知道到底有多少级目录,所以需要递归实现
-
代码实现:
package demo.digui; import java.io.File; public class DiGuiDemo2 { public static void main(String[] args) { //创建File对象 File file = new File("/Users/heroma/IdeaProjects/demo_object"); //打印目录 printDir(file); } public static void printDir(File file){ //获取子文件和文件目录 File[] files = file.listFiles(); //循环打印 /* 当是文件时,输出文件的绝对路径 当时目录时,接着递归遍历,调用打印方法 */ for (File file1 : files) { //判断 if(file1.isFile()){ //是文件,输出文件的绝对路径 System.out.println("文件名:" + file1.getAbsolutePath()); } //是目录,递归调用输出目录绝对路径 else{ //是目录,输出目录的绝对路径 System.out.println("目录名:" + file1.getAbsolutePath()); printDir(file1); } } } }
综合案例
文件搜索
- 要求:搜索
/Users/heroma/IdeaProjects/demo_object目录中的.java文件 - 思路:
- 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录
- 遍历目录时,收获的子文件,通过文件名称,判断是否符合条件
代码实现:
package demo.digui;
import java.io.File;
public class DiGuiDemo2 {
public static void main(String[] args) {
//创建File对象
File file = new File("/Users/heroma/IdeaProjects/demo_object");
//打印目录
printDir(file);
}
public static void printDir(File file){
//获取子文件和文件目录
File[] files = file.listFiles();
//循环打印
/*
当是文件时,输出文件的绝对路径
当时目录时,接着递归遍历,调用打印方法
*/
for (File file1 : files) {
//判断
if(file1.isFile()){
//是文件,输出文件的绝对路径
if(file1.getName().endsWith(".java"))
System.out.println("文件名:" + file1.getAbsolutePath());
}
//是目录,递归调用输出目录绝对路径
else{
//是目录,输出目录的绝对路径
// System.out.println("目录名:" + file1.getAbsolutePath());
printDir(file1);
}
}
}
}
文件过滤器优化
java.io.FileFilter是一个接口,是File的过滤器。该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,该接口中只有一个方法boolean accept(File pathname):测试pathname是否应该包含在当前File目录中,符合则返回true。
- 分析:
- 接口作为参数,需要传递子类对象,重写其中方法。可以使用匿名内部类的方式。
- accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:
- 要么是.java文件
- 要么是目录,用于继续遍历
- 通过过滤器的作用,
listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。
代码实现:
package demo.digui;
import java.io.File;
import java.io.FileFilter;
public class DiGuiDemo2 {
public static void main(String[] args) {
//创建File对象
File file = new File("/Users/heroma/IdeaProjects/demo_object");
//打印目录
printDir(file);
}
public static void printDir(File file){
//获取子文件和文件目录
File[] files = file.listFiles(new FileFilter() {
public boolean accept(File file) {
return file.getName().endsWith(".java")||file.isDirectory();
}
});
//循环打印
/*
当是文件时,输出文件的绝对路径
当时目录时,接着递归遍历,调用打印方法
*/
for (File file1 : files) {
//判断
if(file1.isFile()){
//是文件,输出文件的绝对路径
// if(file1.getName().endsWith(".java"))
System.out.println("文件名:" + file1.getAbsolutePath());
}
//是目录,递归调用输出目录绝对路径
else{
//是目录,输出目录的绝对路径
// System.out.println("目录名:" + file1.getAbsolutePath());
printDir(file1);
}
}
}
}
Lambda优化
-
分析:
FileFilter是只有一个方法的接口,因此可以使用lambda表达式简写。 -
lambda格式:
()->{}
代码实现:
package demo.digui;
import java.io.File;
import java.io.FileFilter;
public class DiGuiDemo2 {
public static void main(String[] args) {
//创建File对象
File file = new File("/Users/heroma/IdeaProjects/demo_object");
//打印目录
printDir(file);
}
public static void printDir(File file){
//获取子文件和文件目录
File[] files = file.listFiles(f ->{
return f.getName().endsWith(".java")||f.isDirectory();
});
//循环打印
/*
当是文件时,输出文件的绝对路径
当时目录时,接着递归遍历,调用打印方法
*/
for (File file1 : files) {
//判断
if(file1.isFile()){
//是文件,输出文件的绝对路径
// if(file1.getName().endsWith(".java"))
System.out.println("文件名:" + file1.getAbsolutePath());
}
//是目录,递归调用输出目录绝对路径
else{
//是目录,输出目录的绝对路径
// System.out.println("目录名:" + file1.getAbsolutePath());
printDir(file1);
}
}
}
}
Java File类与递归详解
本文深入解析Java中File类的使用方法,包括构造、属性获取、文件操作及目录遍历。同时,通过递归算法实现目录搜索,提供文件过滤器与Lambda表达式的优化方案。
387

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



