File类
File类是文件目录路径抽象表示,主要用于文件和目录创建/查找/删除等操作
1. 构造方法
a File(String path) : 通过将给定的路径字符串转换为抽象路径名来创建 file 实例
b File(String FatherPath, String SonPath): 从父路径名字字符串和子路径字符串创建新的 File 实例
c File(File FatherPath, String Sonpath) : 从抽象路径名和子路径名字字符串创建新的 File 实例
如:
//文件路径名
String pathname = "D:\\zzz.txt";
File fileone = new File(pathname);
//通过父路径和子路径字符串
String fpath = "D:\\aaa";
String spath = "ccc.txt";
File filetwo = new File(fpath,spath);
//通过父级 File 对象和子路径字符串
File fatherdir = new File("d:\\aaa");
String sonpath = "bbb.txt";
File filethree = new File(fatherdir,sonpath);
2. 常用方法
getAbsolutePath() : 返回此File 的绝对路径字符串;
getpath(): 将File 转换为路径名字字符串
getName() : 返回由此 File 表示的文件或目录的名称
length() : 返回由此Fiel 表示的文件的长度
import java.io.File;
public class FileDemoTwo {
public static void main(String[] args){
File file = new File("d://aaa/bbb.txt");
System.out.println("绝对路径:" + file.getAbsolutePath());
System.out.println("文件目录路径: "+ file.getPath());
System.out.println("文件或目录的名称: " + file.getName());
System.out.println("文件长度: " + file.length() + "字节");
File filetwo = new File("D://aaa");
System.out.println("绝对路径: " + filetwo.getAbsolutePath());
System.out.println("文件目录路径:" + filetwo.getPath());
System.out.println("文件或目录的名称: " + filetwo.getName());
System.out.println("目录长度: " + filetwo.length());
}
}
输出:
3. 绝对路径与相对路径
绝对路径: 包括盘符一整个路径
相对路径: 相对于项目的路径
import java.io.File;
public class AbsolutelyRelativeDemo {
public static void main(String[] args){
//G盘下的 ccc.java文件 //绝对路径
File fileone = new File("G:\\ccc.java");
System.out.println(fileone.getAbsoluteFile());
//项目下的 bbb.java文件 //相对路径
File filetwo = new File("bbb.java");
System.out.println(filetwo.getAbsoluteFile());
}
}
输出:
4. 判断功能的方法
exists() : 表示文件或目录是否存在
isDirectory() : 表示是否为目录
isFile() : 表示是否为文件
import java.io.File;
public class FileEstimateDemo {
public static void main(String[] args){
File file1 = new File("G:\\ccc.java");
File file2 = new File("G:\\aaa_project\\bbb.java");
//判断是否存在
System.out.println("判断file1是否存在: " + file1.exists());
System.out.println("判断file2是否存在: " + file2.exists());
//判断是否是文件
System.out.println("判断file1是否是文件: " + file1.isFile());
//判断是否是目录
System.out.println("哦安短files是否是目录: " + file2.isDirectory());
}
}
输出:
5. 创建与删除
createmNewFile() : 创建文件不存在时创建一个空的新文件
delete() : 删除由此 File 表示的文件或目录
mkdir():创建一个目录
mkdirs() : 创建由此File 表示的目录,包括任何必须但不存在的父目录
import java.io.File;
import java.io.IOException;
public class MakeFileandDir {
public static void main(String[] args) throws IOException {
//创建文件
File makefile = new File("G:\\ddd.txt");
//判断是否存在
System.out.println(makefile.exists()); //false
//创建文件
makefile.createNewFile();
//判断是否存在(是否已经创建好)
System.out.println(makefile.exists());//创建文件 //true
//创建目录
File makedir = new File("G:\\fff");
//判断是否存在
System.out.println(makedir.exists()); //false
//创建目录
makedir.mkdir();
//判断是否存在(是否已经创建好)
System.out.println(makedir.exists()); //truw
//创建多级目录
File makedirs = new File("G:\\ggg\\hhh");
//创建目录
makedir.mkdirs();//使用mkdir() 的话会失败
//文件删除
System.out.println(makefile.delete()); //true
//删除目录
System.out.println(makedir.delete()); //true
System.out.println(makedirs.delete()); //false //空的才可以被删除
}
}
注意: delete方法,如果是目录,则目录必须是空的才能删除
6. 目录的遍历
list() : 返回一个String 数组,表示 File 目录中所有子文件或目录
listFiles() : 返回一个File数组, 表示 File 目录中的所有的子文件或目录
import java.io.File;
public class TraverseFileDemo {
public static void main(String[] args){
File fileone = new File("G:\\aaa_project");
//文件夹结构: G:\aaa_project\bbb.java
// G:\aaa_project\ccc\ddd.txt
//获取当前目录下的文件及文件夹名称
String[] nee = fileone.list();
for(String s : nee){
System.out.println(s);
}
System.out.println("------------- 分界 -------------");
//获取当前目录下的文件及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] files= fileone.listFiles();
for (File file : files){
System.out.println(file);
}
}
}
输出:
递归
1. 递归的了解
递归:方法内调调用自己
递归分类:
直接递归:方法自身调用自己
简介递归:A方法调用BB方法,B方法调用C方法,C方法调用A方法
注意:
递归要有一定条件,保证递归能够停下来,否则会发生栈内存溢出
在递归中虽然有一定体哦阿健,但是递归次数不能太多,否则也会发生内存溢出
构造方法禁止递归
public class RecursionTest {
public static void main(String[] args){
//a(); 报错没有一定的限定条件,会造成栈内存溢出
b(1);
}
private static void b(int i){
System.out.println(i);
if(i==5000){
return;
}
b(++i);
}
private static void a(){
System.out.println("a方法");
a();
}
}
++i 与 i++ 的区别
i++ 先赋值再运算
++i 先运算赋赋值
如:
public class TestOne {
public static void main(String[] args){
int i=1, a=0;
int j=1, b=0;
a = i++;
//先赋值 a=i ,后运算 i = i + 1,所以结果为1
System.out.println(a); //1
b = ++j;
//先运算 j = j + 1,后赋值 b=j,所以结果为2
System.out.println(b); //2
}
}
输出:
2. 递归的使用
2.1 递归累加求和
计算 1 到 100 的累加和
public class SunDemoOne {
public static void main(String[] args){
//计算 1 - 100 的和
int num = 100;
int sums = sum(num);
System.out.println(sums);
}
public static int sum(int num){
if(num == 1){
return 1;
}
return num + sum(num - 1 );
}
}
输出:
2.1 递归求阶乘
求5的阶乘
public class foctDemo {
public static void main(String[] args) {
int num = 5;
System.out.println(getnum(num));
}
public static int getnum(int num){
if (num == 1){
return 1;
}
return num * getnum(num -1);
}
}
输出:
3. 使用递归打印多级目录
import java.io.File;
/*
文件夹结构: G:\aaa_project\bbb.java
G:\aaa_project\ccc\ddd.txt
*/
public class DiguiFiel {
public static void main(String[] args){
//创建File 对象
File filename = new File("G:\\aaa_project");
printDirname(filename);
}
public static void printDirname(File filename){
File[] files = filename.listFiles();
for (File file : files){
if(file.isFile()){
//如果是文件输出其 绝对路径
System.out.println("文件名: " + file.getAbsolutePath());
}else {
//答打印目录的聚堆路径
System.out.println("目录: " + file.getAbsolutePath());
//调用自己,继续遍历,以形成递归
printDirname(file);
}
}
}
}
输出:
文件搜索
如搜索: G:\aaa_project 中的 .java 文件
import java.io.File;
public class selectFiles {
public static void main(String[] args){
//创建 File 对象
File file = new File("G:\\aaa_project");
printFilename(file);
}
public static void printFilename(File file){
//获取文件和目录
File[] dirs = file.listFiles();
for(File dir : dirs){
if (dir.getName().endsWith(".java")){
System.out.println("文件名: "+ dir.getAbsolutePath());
}else {
try {
printFilename(dir);
}catch (Exception e){
throw new NullPointerException("搜索完毕,未搜索到其他 .java为后缀的其他文件");
}
}
}
}
}
输出:
其中的
endsWith() 方法用于测试字符串是否以指定的后缀结束
文件过滤器优化
FileFilter 是一个接口,是File 的过滤器,该接口的对象可以传递给File 类的 ListFiles(FileFilter) 作为参数,接口中只有一个方法.
boolean accept(File pathname) ; cehsi pathname : 测试当前 File 是否应该包含在当前File 目录中,符合则返回 True
1. 接口作为参数,需要传递子类对象,重写其方法,可以选择匿名内部类的方式,比较简单
2. accept 方法,参数 File ,表示当前 File 下所有的子文件和子目录, 保留住则返回 true,过滤掉则返回 false
保留规则:
1. 要么是java 文件
2. 要么是目录,用于继续遍历
3. 通过过滤器的作用 listFiles(FileFilter) 返回数组元素中,子文件对像都是符合条件的,可以直接打印
import java.io.File;
import java.io.FileFilter;
public class fielTestDemothree {
public static void main(String[] args){
File dir = new File("G:\\aaa_project");
printfilebnane(dir);
}
public static void printfilebnane(File dir){
//匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java") || pathname.isDirectory();
}
});
//循环打印
for (File fil : files) {
if(fil.isFile()){
System.out.println("文件名:" + fil.getAbsolutePath());
}else {
printfilebnane(fil);
}
}
}
}
输出:
可以使用 Lambda表达式优化上面的代码
import java.io.File;
public class LambdaFiledDemo {
public static void main(String[] args){
File dir = new File("G:\\aaa_project");
printfilebnane(dir);
}
public static void printfilebnane(File dir){
//匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(f ->{
return f.getName().endsWith(".java") || f.isDirectory();
});
//循环打印
for (File fil : files) {
if(fil.isFile()){
System.out.println("文件名:" + fil.getAbsolutePath());
}else {
printfilebnane(fil);
}
}
}
}
输出: