笔记 —— File

需求:从键盘接受一个文件夹路径,统计文件夹的大小

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);
	}

猜你喜欢

转载自blog.csdn.net/weixin_41463971/article/details/86679653