需求:从键盘接受一个文件夹路径,统计文件夹的大小
File
是不能直接获取文件夹大小的;获取文件夹大小必须遍历文件夹内所有文件,累加计算
1、获取文件夹路径
public static File getDir() {
// 1、创建键盘录入对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入文件夹路径:");
// 2、定义一个无限循环,把键盘录入的结果存储,并封装成 File 对象
while (true) {
String line = scanner.nextLine();
File dir = new File(line);
// 3、判断 File 是否存在;若存在则返回 File 对象,若不存在则重新输入
if (dir.exists()) {
return dir;
} else if (dir.isFile()) {
System.out.println("你录入的是文件路径,请输入文件夹路径:");
} else {
System.out.println("你录入的文件夹路径不存在,请重新输入:");
}
}
}
2、统计文件夹大小:
public static long getFileLength(File dir) {
// 1、定义一个求和变量
long len = 0;
// 2、获取该文件夹下所有的文件和文件夹 listFiles();
File[] subFiles = dir.listFiles();
// 3、遍历数组
for (File subFile : subFiles) {
if (subFile.isFile()) {
// 4、判断是文件就计算大小被累加
len += subFile.length();
} else {
// 5、判断是文件夹递归调用
len += getFileLength(subFile);
}
}
return len;
}
3、删除文件夹:
public static void deleteDir(File dir) {
// 获取文件夹路径下的文件
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
if (subFile.isFile()) {
subFile.delete(); // 如果是文件,直接删除
} else {
deleteDir(subFile); // 如果是文件夹,递归调用
}
}
// 删除空文件
dir.delete();
}
4、把文件A拷贝到文件B下
/*
* 把 src 文件夹(含内容)拷贝到 dest 中
* @src 源文件
* @dest 目标文件
* */
public static void copy(File src, File dest) {
// 1、在目标文件中创建原文件夹
File newDir = new File(dest, src.getName());
newDir.mkdirs(); // 创建目录
// 2、获取源文件中所有的文件和文件夹,存储在 File数组中
File[] subFiles = src.listFiles();
for (File subFile : subFiles) {
if (subFile.isFile()) {
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(newDir, subFile.getName())));
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
bis.close();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
copy(subFile, newDir);
}
}
}
5、按层级打印文件夹和文件;
public static void printLevel(File dir, int level) {
// 2、遍历数组
File[] subFiles = dir.listFiles();
for (File subFile : subFiles) {
for (int i = 0; i <= level; i ++) {
System.out.print("\t");
}
// 3、无论是文件还是文件夹,都需要直接打印
System.out.println(subFile);
// 4、如果是文件夹,则递归调用
if (subFile.isDirectory()) {
printLevel(subFile, level + 1);
}
}
}
调用上述方法:
// 获取文件夹大小
File dir = getDir();
long len = getFileLength(dir);
System.out.println("文件字节数:" + len);
// 删除文件夹和文件夹下的文件
System.out.println("删除文件夹和文件夹下的文件");
deleteDir(dir);
File src = getDir();
File dest = getDir();
if (src.equals(dest)) { // 若 src 和 dest 文件路径相同,不允许拷贝!(不让自己拷贝自己)
System.out.println("目标文件夹是源文件夹的子文件夹");
} else {
copy(src, dest);
}