楊老師課堂_Java核心技術下之控制台模擬文件管理器案例


背景需求介紹:

編寫一個模擬文件管理器的程序,實現控制台對文件和文件夾的管理操作。

要求在此程序中:
當用戶輸入指令 1 時,代表“指定關鍵字檢索文件”,此時需要用戶輸入檢索的目錄和關鍵
    字,系統在用戶指定的目錄下檢索出文件名中包含關鍵字的文件,並將其絕對路徑展現出來;


指定 2 時,代表“指定后綴名檢索文件”,此時需要用戶輸入檢索的目錄和后綴名,系統在用

    戶指定的目錄下檢索出指定后綴名的文件,並將其絕對路徑展現出來。

指令 3 代表“復制文件/目錄”,此時需要用戶輸入源目錄和目標目錄,程序執行后,或將與原

    目錄下的內容復制到目標目錄下,

指令 4 代表“退出”即退出該系統。

預覽效果圖: 

思路解析:

案例分析:

(1)、根據任務介紹和運行結果分析可知,首先需要創建一個文件管理器內,可以在類中使
用 while 循環實現控制台中的操作之間的多次輸入,並使用 switch 語句,根據控制台輸入的
指令來判斷執行什么操作。


(2)、執行指令 1 時,代表指定關鍵字檢索文件,即在目錄下查找包含關鍵字的文件,執行
時,先要從控制台獲取目錄和關鍵字,然后將其傳到后台的方法中,后台可將傳入關鍵字利
用過濾器制定成“規則”,通過遞歸的方式遍歷文件夾,在每個子文件下調用過濾器來獲取
符合規則的文件路徑的集合,並將集合返回,最后打印出來。


(3)、執行指令 2 時,代表指定后綴名檢索文件系在目錄下查找名稱結尾是指定后綴的文件,
執行時可以先從控制台獲取目錄和后綴名,然后將后綴名拆分成數組,並將數組和目錄傳到
后台方法中,后台可用過濾器,將后綴名數組循環遍歷,制定成“規則”,通過遞歸的方式,
遍歷文件夾,在每個子文件夾下調用過濾器來獲取符合規則的文件路徑的集合,並將集合返
回,最后打印出來。


(4)、執行指令 3 時,代表將原目錄的內容復制到目標目錄中。執行時可以先從控制台獲取
源目錄和目標目錄,然后將其傳入后台,后台主要是通過遞歸的方法,執行文件和文件夾復
制的,每次調用此方法時,首先會獲取當前目錄下的文件和文件夾列表,然后循環列表,並
判斷當前元素是文件還是文件夾,如果是文件夾就利用 File 類中的 mkdirs()方法在目標目錄
中創建此文件夾,在調用自身;如果是文件,由於不一定是純文本文件,所以可以采用字節
流將文件寫入目標目錄。


(5)、執行指令 4,執行退出該程序操作,該操作可以使用 System.exit(0)完成實現;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

示例代碼:

package cn.javabs.iocase;

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

/**
 * 
 * @author Mryang
 * 
 */
public class DocumentManager {

    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("---1:指定關鍵字檢索文件 2:指定后綴名檢索文件 3:賦值文件/目錄 4:退出----");
        while (true) {
            System.out.println("請輸入命令:");
            int command = scan.nextInt();
            switch (command) {
            case 1:
                searchByKeyWorld();
                break;
            case 2:
                searchBySuffix();
                break;
            case 3:
                copyDirectory();
            case 4:
                exit();
                break;
            default:
                System.out.println("您輸入的指令錯誤!");
                break;
            }
        }
    }

    /**
     * 指定后綴名檢索文件
     */
    private static void searchBySuffix() {
        Scanner scan = new Scanner(System.in);
        System.out.print("請輸入您要檢索的目錄的位置");
        String path = scan.next();
        File file = new File(path);
        if (!file.exists() || !file.isDirectory()) {
            System.out.println(path + "(不是有效目錄)");
            return;
        }
        System.out.println("您輸入搜索后綴:");
        String suffix = scan.next();
        String[] suffixArray = suffix.split(",");
        ArrayList<String> list = FileUtils.listFiles(file, suffixArray);
        for (Object obj : list) {
            System.out.println(obj);
        }
    }

    /**
     * 退出
     */
    private static void exit() {
        System.out.println("您已退出系統,謝謝使用");
        System.exit(0);
    }

    /**
     * 復制文件/目錄
     * 
     * @throws Exception
     */
    private static void copyDirectory() throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.print("請輸入源目錄");
        String srcDirectory = scan.next();
        File srcFile = new File(srcDirectory);
        if (!srcFile.exists() || !srcFile.isDirectory()) {
            System.out.println("無效目錄!");
            return;
        }
        System.out.print("請輸入目標位置:");
        String destDirectory = scan.next();
        File destFile = new File(destDirectory);
        if (!destFile.exists() || !destFile.isDirectory()) {
            System.out.println("無效位置!");
            return;
        }
        FileUtils.copySrcPathToDestPath(srcFile, destFile);
    }

    /**
     * 指定關鍵字檢索文件
     */
    private static void searchByKeyWorld() {
        Scanner scan = new Scanner(System.in);
        System.out.print("請輸入您要檢索的目錄的位置");
        String path = scan.next();
        File file = new File(path);
        if (!file.exists() || !file.isDirectory()) {
            System.out.println(path + "(不是有效目錄)");
            return;
        }
        System.out.println("您輸入搜索關鍵字:");
        String key = scan.next();
        ArrayList<String> list = FileUtils.listFiles(file, key);
        for (Object obj : list) {
            System.out.println(obj);
        }
    }
}

 

工具類:

package cn.javabs.iocase;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.util.ArrayList;

public class FileUtils {

    public static ArrayList<String> listFiles(File file,
            final String[] suffixArray) {
        FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File currFile = new File(dir, name);
                if (currFile.isFile()) {
                    for (String suffix : suffixArray) {
                        if (name.endsWith("." + suffix)) {
                            return true;
                        }
                    }
                }
                return false;
            }
        };
        ArrayList<String> arraylist = fileDir(file, filter);
        return arraylist;
    }

    /**
     * 復制文件/目錄
     * 
     * @param srcFile
     * @param desFile
     * @throws Exception
     */
    public static void copySrcPathToDestPath(File srcFile, File destFile)
            throws Exception {
        File[] files = srcFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            File copiedFile = new File(destFile, files[i].getName());
            if (files[i].isDirectory()) {
                if (!copiedFile.mkdirs()) {
                    System.out.println("無法創建 + copiedFile");
                    return;
                }
                copySrcPathToDestPath(files[i], copiedFile);
            } else {
                FileInputStream input = new FileInputStream(files[i]);
                FileOutputStream output = new FileOutputStream(copiedFile);
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = input.read(buffer)) != -1) {
                    output.write(buffer, 0, len);
                }
                input.close();
                output.close();
            }
        }
    }

    /**
     * 指定關鍵字檢索文件
     * 
     * @param file
     * @param key
     * @return
     */
    public static ArrayList<String> listFiles(File file, final String key) {
        FilenameFilter filter = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File currFile = new File(dir, name);
                if (currFile.isFile() && name.contains(key)) {
                    return true;
                }
                return false;
            }
        };
        // 遞歸當時獲取規定的路徑
        ArrayList<String> arraylist = fileDir(file, filter);
        return arraylist;
    }

    /**
     * 
     * @param dir
     * @param filter
     * @return
     */
    private static ArrayList<String> fileDir(File dir, FilenameFilter filter) {
        ArrayList<String> arraylist = new ArrayList<String>();
        File[] lists = dir.listFiles(filter);
        for (File list : lists) {
            arraylist.add(list.getAbsolutePath());
        }
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory()) {
                ArrayList<String> every = fileDir(file, filter);
                arraylist.addAll(every);
            }
        }
        return arraylist;
    }
}

 

分割線 
作者: 楊校

出處: https://www.cnblogs.com/xiaoxiao5016/

分享是快樂的,也見證了個人成長歷程,文章大多都是工作經驗總結以及平時學習積累,基於自身認知不足之處在所難免,也請大家指正,共同進步。

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出, 如有問題, 可郵件(397583050@qq.com)咨詢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM