学习目标:
- 熟练使用File类,能够实现创建与删除文件文件夹操作;
- 掌握常用的搜索文件夹或者文件的方法;
- 理解递归的概念,并熟练使用递归完成搜索工作。
学习内容:
一、File类
1、简介
- java.io.File
- 对文件或文件夹(目录)的封装类
2、主要功能
- 创建文件、文件夹
- 删除文件、文件夹
- 查找文件、文件夹
- 判断是否存在文件、文件夹
- 遍历文件夹(目录)
- 获取文件的大小
3、静态成员变量
- pathSeparator
- Static String pathSeparator;
- 路径分隔符,window-; linux-:
- pathSeparatorChar
- Static Char pathSeparatorChar;
- 转换成字符的路径分隔符
- fileSeparator
- Static String fileSeparator;
- 文件夹名称分隔符,window-\ linux-/
- PS:
- 程序中的路径不能写死---->
“c:”+File.fileSeparator+“File”+File.fileSeparator+“name”
4、路径
- 路径不区分大小写
- windows中路径的文件名称用反斜杠分割,反斜杠是转义字符,两个反斜杠表示一个普通的反斜杠
5、构造方法
- File(String pathString); # 创建对应字符串路径的文件对象
- File(String parent, String child); # 将字符串路径分为父与子两部分进行拼接
- File(File parent, String child); # 将字符串路径分为父类文件对象与子类字符串进行拼接
6、成员方法
- 获取类功能
- public String getAbsolutePath(); # 获取绝对路径
- public String getPath(); # 获取File对象传递的路径
- public String getName(); # 获取文件或文件夹的名字
- public Long length(); # 获取文件的大小(kb)
注意:文件夹与不存在的路径的大小都是0
- 判断类功能
- public boolean exists(); # 判断路径是否存在
- public boolean isDirectory(); # 判断是不是文件夹
- public boolean isFile(); # 判断是不是文件
注意:
如果路径不存在,下面的两个判断都是false
- 创建删除功能
- public boolean createNewFile(); # 创建文件,如果存在不创建,返回false
如果创建文件的路径不存在,抛出异常 - public boolean mkdir(); # 创建目录,单级目录
- public boolean mkdirs(); # 创建目录,单级或多级目录
- public boolean delete(); # 删除文件或文件夹,文件夹有内容不会删除,而且是不经过
回收站的直接删除
- 遍历功能
- public String[] list(); # 遍历目录下的所有文件与文件夹,并转换成字符串数组
- public File[] listFiles(); # 遍历目录下的所有文件与文件夹,并转换成File对象数组
- 注意:
- 当目录不存在或者是一个文件时,会报空指针异常
- 两种方法都可以显示隐藏起来的文件与文件夹
二、递归
1、简介
- 概念
自己调用自己 - 分类
- 直接递归:自己调用自己
- 间接递归:A调用B,B调用C,C调用A
- 注意事项
- 递归一定要有条件限制,保证其能够停下来,防止发生栈内存溢出;
- 递归的次数不能太多,否则也会发生栈内存溢出;
- 构造方法,禁止递归。
- 使用前提
- 调用方法时,主体不变,参数变化
学习产出:
1、File 静态成员变量
package mypackage.day15.demo01;
import java.io.File;
public class FileStaticVar {
public static void main(String[] args) {
System.out.println(File.separator);
System.out.println(File.separatorChar);
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
System.out.println("C:"+File.separator+"a.txt");
}
}
2、File构造方法
package mypackage.day15.demo01;
import java.io.File;
public class FileConstruct {
public static void main(String[] args) {
construct1();
construct2();
construct3();
}
private static void construct3() {
File subfile = new File("D:\\Aplication\\WeChat\\StoreFile");
File file = new File(subfile, "WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
System.out.println(file);
}
private static void construct2() {
File file = new File("D:\\Aplication\\WeChat\\StoreFile",
"WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
System.out.println(file);
}
private static void construct1() {
File file = new File("D:\\Aplication\\WeChat\\StoreFile" +
"\\WeChat Files\\wxid_nqv5pfqxwpdh21\\FileStorage\\File\\2020-10");
System.out.println(file);
}
}
3、 File成员方法
package mypackage.day15.demo02;
import java.io.File;
import java.io.IOException;
public class FileMemberMethod {
public static void main(String[] args) throws IOException {
File file = new File("D:\\Aplication\\WeChat\\StoreFile");
System.out.println("====get====");
mem1(file);
System.out.println("====judge====");
mem2(file);
System.out.println("====create and delete====");
mem3(file);
System.out.println("====look====");
mem4();
}
private static void mem4() {
File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1);
}
}
private static void mem3(File file) throws IOException {
File file1 = new File(file, "\\test\\abc");
System.out.println(file1.mkdirs());
System.out.println(file1.mkdir());
System.out.println(file1.createNewFile());
System.out.println(file1.delete());
}
private static void mem2(File file) {
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
}
private static void mem1(File file) {
System.out.println(file.getAbsolutePath());
System.out.println(file.getAbsoluteFile());
System.out.println(file.getPath());
System.out.println(file.getName());
System.out.println(file.length());
}
}
4、练习:使用递归计算1-n之间的和
package mypackage.day15.demo03;
import java.io.File;
import java.io.IOException;
public class RecursionExecise1 {
public static void main(String[] args) {
int sum = sum(100);
System.out.println(sum);
}
private static int sum(int i) {
if (i==1){
return 1;
}
return i+sum(i-1);
}
}
5、练习:使用递归计算n的阶乘
package mypackage.day15.demo03;
public class RecursionExecise2 {
public static void main(String[] args) {
int jiecheng = jc(5);
System.out.println(jiecheng);
}
private static int jc(int i) {
if (i==1){
return 1;
}
return i*jc(i-1);
}
}
6、练习:递归打印多级目录
package mypackage.day15.demo03;
import java.io.File;
public class RecursionExecise3 {
public static void main(String[] args) {
File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
getFilesName(file);
}
private static void getFilesName(File file) {
System.out.println(file);
if (file.isDirectory()){
File[] files = file.listFiles();
for (File file1 : files) {
if (file1.isDirectory()){
getFilesName(file1);
}else {
System.out.println(file1);
}
}
}
}
}
7、练习:文件搜索
package mypackage.day15.demo03;
import java.io.File;
public class RecursionExecise4 {
public static void main(String[] args) {
File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
findFilesName(file);
}
private static void findFilesName(File file) {
if (file.isDirectory()){
File[] files = file.listFiles();
for (File file1 : files) {
if (file1.isDirectory()){
findFilesName(file1);
}else {
if (file1.toString().endsWith(".jpg")){
System.out.println(file1);
}
}
}
}
}
}
8、过滤器的使用
package mypackage.day15.demo03;
import java.io.File;
import java.io.FileFilter;
public class RecursionExecise5 {
public static void main(String[] args) {
File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
findFilesName(file);
}
private static void findFilesName(File file) {
File[] files1 = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()){
findFilesName(pathname);
return false;
}else {
if (pathname.toString().endsWith(".jpg")){
return true;
}
return false;
}
}
});
for (File file1 : files1) {
System.out.println(file1);
}
}
}
9、练习:用过滤器进行文件搜索
package mypackage.day15.demo03;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class RecursionExecise6 {
public static void main(String[] args) {
File file = new File("D:\\Aplication\\WeChat\\StoreFile\\WeChat Files\\All Users");
findFilesName(file);
}
private static void findFilesName(File file) {
// File[] files1 = file.listFiles(new FilenameFilter() {
// @Override
// public boolean accept(File dir, String name) {
// File pathname = new File(dir, name);
// if (pathname.isDirectory()){
// findFilesName(pathname);
// return false;
// }else {
// if (pathname.toString().endsWith(".jpg")){
// return true;
// }
// return false;
// }
// }
// });
File[] files1 = file.listFiles((dir, name)->{
return dir.toString().endsWith(".jpg") || name.endsWith(".jpg");
}
);
for (File file1 : files1) {
System.out.println(file1);
}
}
}