要计算文件大小和本地文件的删除,那么我们首先得了解一个概念:递归算法
递归算法:是把问题转化为规模更小的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
简单的说就是一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).我们在计算文件大小和本地文件删除的过程中就用到这个算法。
1.计算文件大小
思路:首先对文件进行判断有两种情况:第一种:是文件,那么可以直接对该文件长度进行计算;第二种:是文件夹,那么将要再次递归调用方法本身。
代码:
package com.etime3.test;
import java.io.File;
public class FileLength {
public static void main(String[] args) {
FileLength fileLen = new FileLength();
File file = new File("d:\\file");// 创建一个文件对象并制定路径
long fl = fileLen.fileLength(file);
System.out.println(fl);
}
// 文件夹大小
public long fileLength(File file) {
long fileLen = 0;// 每次都重新计算当文件的大小后返回
if (file.isFile()) {// 判断是否为文件
fileLen = file.length();
return fileLen;// 返回当文件的大小
}
if (file.isDirectory()) {// 判断是否为文件夹
File[] files = file.listFiles();// 对文件遍历
for (File f : files) { // fileLength(f);只有这个在变
fileLen = fileLen + fileLength(f);
} // 类似阶乘的递归,fileLen = 1+2+3+4加的是每一个return的文件大小
}
return fileLen;
}
}
关键点:
方法的运行:每个方法被执行的时候,Java虚拟机都 会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信 息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。运行时进栈,运行完后出栈。
文件是在哪里计算的呢?
每个文件的大小计算都在if (file.isFile()){}这个条件里面的fileLen = file.length();中计算的,只是在if (file.isDirectory()){}条件中的fileLen = fileLen + fileLength(f);这进行累加的,最终得出总文件的大小。
那么关于递归fileLen = fileLen + fileLength(f);是如何计算的?
fileLength(f)传递进去的如果是当文件,那么直接计算大小后就把这个文件的大小直接return返回,每个文件都会return,最终在fileLen = fileLen + fileLength(f);进行累加fileLen = fileLen + fileLen1+fileLen2+fileLen3+…,然后得到总的文件大小。
2.本地文件的删除
代码:
思路类似于计算文件大小,也是判断两次后分别进行操作,若是文件则直接删除,若是文件夹则遍历后递归调用自己,直到遍历出每个文件夹中的所有文件后单个删除。
package com.etime3.test;
import java.io.File;
public class DeleteFile {
public static void main(String[] args) {
DeleteFile delFile = new DeleteFile();
String path = "d:\\file";
delFile.deleteFile(path);
}
// 删除文件夹
public void deleteFile(String path) {
File file = new File(path);// 判断是否为文件
if (file.isFile()) {// 判断是否为文件
file.delete();// 删除单个文件
}
if (file.isDirectory()) {// 判断是否为文件夹
File[] listFiles = file.listFiles();// 对每个文件夹中的文件遍历
for (File f : listFiles) {
deleteFile(f.getAbsolutePath());
} // 递归调用自己
}
file.delete();// 删除每个被删除文件之后的空文件夹
}
}
特变注意:一定要在最后编写代码file.delete();来删除每个被删除文件之后的空文件夹,因为你每次只是遍历出了文价夹中的文件后删除了里面的文件,而并没有删除该文件夹,所以必须进行这一步操作。