【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;
            }
        }
    }
}
相關文章
相關標籤/搜索