【212天】黑马程序员27天视频学习笔记【Day23-上】

叨逼叨两句

  1. 明天又能够告终一个事。

23-(01-08):递归练习

23-01:键盘获取一个文件夹路径,统计文件夹大小

  1. File的length()方法只能统计文件的大小,不能统计文件夹的大小。
package com.test.demo001;

import java.io.File;
import java.util.Scanner;

/**
 * @author wangtao
 *练习:从键盘接收一个文件夹路径,统计该文件夹大小
 */

public class Demo010 {
    public static void main(String[] args){
        File file = getDir();
        System.out.println(getFileLength(file));
    }    
    
    /**
     * @author wangtao
     *1. 从键盘接收一个文件夹路径
     *    1. 建立键盘录入对象
     *    2. 定义一个无限循环
     *    3. 将键盘录入的结果存储在字符串中,并封装成File对象
     *    4. 对File对象作判断
     *    5. 将文件夹路径对象返回
     *
     *2. 统计该文件夹大小
     *    1. 定义一个求和变量
     *    2. 获取该文件夹下全部的文件和文件夹listFiles();
     *    3. 遍历数组
     *    4. 判断是文件就计算大小并累加
     *    5. 判断是文件夹就递归调用
     *
     */
    
    public static File getDir(){
        //1. 建立键盘录入对象
        Scanner sc = new Scanner(System.in);
        //2. 定义一个无限循环
        while(true){
            System.out.println("请输入文件夹路径:");
            String line = sc.nextLine();
            
            //3. 将键盘录入的结果存储在字符串中,并封装成File对象
            File file = new File(line);
            
            //4. 对File对象作判断
            if(!file.exists()){
                System.out.println("该文件夹不存在,请从新输入");
            }else if(file.isFile()){
                System.out.println("您输入的是文件路径,请输入文件夹路径");
            }else{
                //5. 将文件夹路径对象返回
                return file;
            }
        }
    }
    
    public static long getFileLength(File dir){
        //1. 定义一个求和变量
        long len = 0;
        //2. 获取该文件夹下全部的文件和文件夹listFiles();
        File[] files = dir.listFiles();
        //3. 遍历数组
        for(File file: files){
            //4. 判断是文件就计算大小并累加
            if(file.isFile()){
                len = len + file.length();
            //5. 判断是文件夹就递归调用
            }else{
                len = len + getFileLength(file);
            }
        }
        return len;
    }
}

23-02:从键盘接收一个文件夹路径,删除该文件夹

  1. File类的delete()方法不走回收站
package com.test.demo001;

import java.io.File;
import java.util.Scanner;

/**
 * @author wangtao
 *    1. 获取该文件夹下的全部文件和文件夹
 *    2. 遍历数组
 *    3. 判断是文件直接删除
 *    4. 若是是文件夹,递归调用
 *    5. 循环结束后,把空文件夹删除
 */
public class Demo011 {
    public static void main(String[] args) {
        File dir = getDir();
        deleteDir(dir);
    }
    
    public static void deleteDir(File dir){
        //1. 获取该文件夹下的全部文件和文件夹
        File[] subFiles = dir.listFiles();
        //2. 遍历数组
        for(File file: subFiles){
            //3. 判断是文件直接删除
            if(file.isFile()){
                file.delete();
            //4. 若是是文件夹,递归调用
            }else{
                deleteDir(file);
            }
        }
        //5. 循环结束后,把空文件夹删除
        dir.delete();
    }
    
    
    public static File getDir(){
        //1. 建立键盘录入对象
        Scanner sc = new Scanner(System.in);
        //2. 定义一个无限循环
        while(true){
            System.out.println("请输入文件夹路径:");
            String line = sc.nextLine();
            
            //3. 将键盘录入的结果存储在字符串中,并封装成File对象
            File file = new File(line);
            
            //4. 对File对象作判断
            if(!file.exists()){
                System.out.println("该文件夹不存在,请从新输入");
            }else if(file.isFile()){
                System.out.println("您输入的是文件路径,请输入文件夹路径");
            }else{
                //5. 将文件夹路径对象返回
                return file;
            }
        }
    }
}

23-03:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另外一个文件夹中

  1. 不能把源文件夹拷贝到源文件里面
  2. windows系统删除文件也是先递归到最里层再删除
package com.test.demo001;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;


public class Demo012 {
    public static void main(String[] args) throws IOException {
        File src = getDir();
        File dest = getDir();
        copy(src,dest);
        
    }
    
    /**
     * @author wangtao
     *    1. 在目标文件夹中建立原文件夹
     *    2. 获取原文件夹中全部的文件和文件夹,存储在File数组中
     *    3. 遍历数组
     *    4. 若是是文件就用io流读写
     *    5. 若是是文件夹就递归调用
     */
    
    public static void copy(File src,File dest) throws IOException{
        //1. 在目标文件夹中建立原文件夹
        File newDir = new File(dest,src.getName());
        newDir.mkdir();
        //2. 获取原文件夹中全部的文件和文件夹,存储在File数组中
        File[] subFiles = src.listFiles();
        //3. 遍历数组
        for(File subFile : subFiles){
            //4. 若是是文件就用io流读写
            if(subFile.isFile()){
                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();
            //5. 若是是文件夹就递归调用
            }else{
                copy(subFile,newDir);
            }
        }
    }
    
    

    public static File getDir(){
        //1. 建立键盘录入对象
        Scanner sc = new Scanner(System.in);
        //2. 定义一个无限循环
        while(true){
            System.out.println("请输入文件夹路径:");
            String line = sc.nextLine();
            
            //3. 将键盘录入的结果存储在字符串中,并封装成File对象
            File file = new File(line);
            
            //4. 对File对象作判断
            if(!file.exists()){
                System.out.println("该文件夹不存在,请从新输入");
            }else if(file.isFile()){
                System.out.println("您输入的是文件路径,请输入文件夹路径");
            }else{
                //5. 将文件夹路径对象返回
                return file;
            }
        }
    }
}
相关文章
相关标签/搜索