java学习笔记之File类统计文件大小
写在开头
我是一名java小白,目前在B站学习java,学习的视频是尚学堂高琪老师的java300集课程,笔记大部分参考老师的随堂笔记,我仅以博客的方式记录下我的笔记代码和一些个人见解,对一些问题的考虑可能不周全,代码也不够好看,希望大家多多包涵,有意见的也可以在下面评论,我会好好总结错误,慢慢进步的。
实例1
方式:调用递归函数实现
优点:实现简单
缺点:只能统计一个文件夹的大小
import java.io.File;
public class TestFileCount {
public static void main(String[] args) {
// TODO 自动生成的方法存根
File file1=new File("D:\\代码\\java300\\java\\一级目录");
Count(file1);
System.out.println(len);
}
private static long len;
private static void Count(File file1) {
// TODO 自动生成的方法存根
if(file1.exists()&&null!=file1)
{
if(file1.isFile())
{
len=len+file1.length();
}
else {
for(File f1:file1.listFiles())
{
Count(f1);
}
}
}
}
}
先进入文件夹看看大小:
输出结果(正确):
上面说到缺点是只能统计一个文件夹大小,因为调用递归的话,变量len只能定义为公共变量,放在递归函数外层(若放在内层,每次进入递归体,len将初始化)。放在外层意味着下一次调用Count方法,len的值还是保留上一次调用递归函数的值;下面举例子:
在main函数中统计两次同一文件夹的大小
结果:
预期结果应该是两个输出的结果相同,但是len的值翻倍,说明了第二次调用Count函数时len的值为上一次调用Count函数时遗留下来的值。
下面使用面向对象的思想改进代码:
实例2(改进实例1)
方式:同样是调用递归函数实现,但是使用了面向对象的思想
优点:使用面向对象,能够统计多个文件夹的大小
缺点:一丝丝难理解而已(开个玩笑)
public class FileCount {
private long len;//定义文件的大小
private String path;//定义文件的路径
private File source;//定义源文件
public FileCount(String path)//生成相应的构造方法
{
super();
// TODO 自动生成的构造函数存根
this.path=path;
this.source=new File(path);
Count(this.source);//调用count方法
}
public long getLen() //相应的get方法
{
return len;
}
private void Count(File file1)//count方法
{
// TODO 自动生成的方法存根
if(file1.exists()&&null!=file1)//如果文件存在
{
if(file1.isFile())//如果他是个文件
{
len=len+file1.length();
}
else //如果他是文件夹
{
for(File f1:file1.listFiles())//在当前文件夹下,递归调用Count
{
Count(f1);
}
}
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
TestFileCount01 f1=new TestFileCount01("D:/代码/java300/java/一级目录");
System.out.println(f1.getLen());
TestFileCount01 f2=new TestFileCount01("D:/代码/java300");
System.out.println(f2.getLen());
}
}
先进入文件夹看看大小:
文件夹1.D:/代码/java300/java/一级目录
文件夹2.D:/代码/java300
输出结果(正确):