目录
文件遍历(遍历所有文件及文件夹)
需求分析
问题解决
运行结果
文件搜索
需求分析
问题解决
运行结果
删除非空文件夹
啤酒问题(递归案例)
文件遍历(遍历所有文件及文件夹)
需求分析
需求:要求遍历一个文件夹里面所有的文件及其文件夹。
分析:
- 先判断指定地址的文件对象是文件还是文件夹
- 如果是文件夹,则找出里面的所有一级文件对象;如果是文件,则记录文件数量+1
- 遍历一遍全部一级文件对象
- 再遍历一遍,区分出文件和文件夹
- 如果是文件,记录文件数量+1
- 如果是文件夹,记录文件夹数量+1,并进入该文件夹递归,重复上述过程
问题解决
import java.io.File;
public class FileTest {
static int countfile = 0; //用于记录文件的个数
static int countdir = 0; //用于记录文件夹的个数
public static void main(String[] args) {
//链接文件到文件对象中
File f1 = new File("E:/Programme/vs2019");
Search(f1);
System.out.println("遍历所有文件完毕。文件共:" + countfile + "个,文件夹共:" + countdir + "个。");
}
private static void Search(File file) {
//把非法的情况都拦截
if(file == null || !file.exists()){
return;
}
//判断是否是文件
if(file.isFile()){
countfile++; //文件数量+1
System.out.println(file.getAbsolutePath()); //输出一下
return;
}else{
//证明是文件夹,输出一下当前是哪个文件夹
System.out.println("----" + file.getName() + "----");
//既然是文件夹,那我们取到它的所有一级文件对象
File[] files = file.listFiles();
//先遍历输出一下所有文件及文件夹
for(File f:files){
System.out.println(f.getAbsolutePath());
}
System.out.println("------------------------------");
//再判断其中为文件夹的部分,进行递归遍历
for(File f:files){
if(f.isDirectory()){
countdir++;
Search(f);
}else{
countfile++;
}
}
}
}
}
运行结果
到Windows系统中查看,对比一下是否正确
文件搜索
需求分析
需求:从D:盘中,搜索“QQ.exe”这个文件,找到后直接输出其位置。
分析:
- 先找出D:盘下的所有一级文件对象
- 遍历全部一级文件对象,判断是否是文件
- 如果是文件,判断是否是自己想要的
- 如果是文件夹,需要继续进入到该文件夹,重复上述过程
问题解决
import java.io.File;
public class FileTest5 {
public static void main(String[] args) {
File file = new File("D:/");
try {
if(!searchFile(file,"QQ.exe")){
System.out.println("找不到该文件!");
}
} catch (FileIllegalRuntimeException e) {
System.out.println(e.getMessage());
}
}
static int flag = 0; //用于记录是否找到了目标文件
public static boolean searchFile(File dir,String fileName) throws FileIllegalRuntimeException{
//1.把非法的情况都拦截住
if(dir == null || !dir.exists() || dir.isFile()){
throw new FileIllegalRuntimeException("/文件对象有误!"); //代表无法搜索,自定义异常类
}
//2.经过拦截,dir不是null,一定是目录对象
File[] files = dir.listFiles();
//3.判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象
if(files != null && files.length > 0){
//4.遍历全部一级对象
for(File f:files){
//5.判断文件对象是文件还是文件夹
if(f.isFile()){
//是文件,判断这个文件名是否是我们要找的
if(f.getName().contains(fileName)){
System.out.println("找到了:" + f.getAbsolutePath());
flag = 1;
return true;
}
}else{
//是文件夹,继续重复这个过程(递归)
searchFile(f,fileName);
}
}
}
return flag == 0 ? false : true;
}
}
运行结果
删除非空文件夹
目标:删除非空文件夹。
import java.io.File;
public class FileTest6 {
public static void main(String[] args) {
File dir = new File("D:/Program Files/360");
deleteDir(dir);
}
public static void deleteDir(File dir) {
if(dir == null || !dir.exists()){
return;
}
//dir存在且是文件
if(dir.isFile()){
dir.delete();
return;
}
//dir存在且是文件夹,拿里面的一级文件对象
File[] files = dir.listFiles();
if(files == null){
return;
}
//如果是由内容的文件夹,则先删掉里面的内容,再删掉自己
for(File file:files){
if(file.isFile()){
file.delete();
}else{
deleteDir(file);
}
}
dir.delete();
}
}
啤酒问题(递归案例)
啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶?
public class Test {
public static int totalNumber; //总酒量(瓶)
public static int lastBottleNumber; //最终剩余的空瓶数
public static int lastCoverNumber; //最终剩余的瓶盖数
public static void main(String[] args) {
buy(10);
System.out.println("可以喝" + totalNumber + "瓶");
System.out.println("剩余瓶盖数:" + lastCoverNumber);
System.out.println("剩余空瓶数:" + lastBottleNumber);
}
public static void buy(int money) {
//1.先买酒
int buyNumber = money / 2; //花钱买的酒的数量
totalNumber += buyNumber;
//2.把盖子和空瓶数换算成钱,继续买
//计算本轮总的瓶盖数和空瓶数
int allBottleNumber = buyNumber + lastBottleNumber;
int allCoverNumber = buyNumber + lastCoverNumber;
int allMoney = 0; //存储瓶盖和空瓶换算下来的钱
if(allBottleNumber >= 2){
allMoney += (allBottleNumber / 2) * 2;
//2个空瓶换一瓶酒,一瓶酒2元
}
lastBottleNumber = allBottleNumber % 2;
//空瓶换算成钱了,重新计算最终剩余的空瓶数
//瓶盖也是一样
if(allCoverNumber >= 4){
allMoney += (allCoverNumber / 4) * 2;
}
lastCoverNumber = allCoverNumber % 4;
//换算下来的钱再去买酒
if(allMoney >= 2){
buy(allMoney);
}
}
}
运行结果:
END
学习自:黑马程序员——Java课程