博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杨老师课堂_Java核心技术下之控制台模拟文件管理器案例
阅读量:6442 次
发布时间:2019-06-23

本文共 7276 字,大约阅读时间需要 24 分钟。

背景需求介绍:

编写一个模拟文件管理器的程序,实现控制台对文件和文件夹的管理操作。

要求在此程序中:

当用户输入指令 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
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
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
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
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
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
arraylist = fileDir(file, filter); return arraylist; } /** * * @param dir * @param filter * @return */ private static ArrayList
fileDir(File dir, FilenameFilter filter) { ArrayList
arraylist = new ArrayList
(); 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
every = fileDir(file, filter); arraylist.addAll(every); } } return arraylist; }}

 

分割线 

作者: 杨校

出处: 

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询。

 
你可能感兴趣的文章
这一文让你彻底理解Spring框架的意义
查看>>
消息中间件Kafka与RabbitMQ谁更胜一筹?
查看>>
CanisMinor 微信小程序工程
查看>>
手机拍照,调取相册 裁剪,上传
查看>>
当移动数据分析需求遇到Quick BI
查看>>
八皇后,回溯与递归(Python实现)
查看>>
程序员的微创业
查看>>
什么是以太坊
查看>>
刷前端面经笔记(九)
查看>>
针对前端开发可重用组件并发布到NPM
查看>>
Android组件化探索与实践
查看>>
开发笔记2 | Java 代码规约第1条
查看>>
Vue.js 子组件的异步加载及其生命周期控制-------异步加载子组件,子组件的生命周期控制过程不一样...
查看>>
编写可维护的JavaScript
查看>>
高效的CSS代码(2)
查看>>
朱兰的质量三部曲——《可以量化的管理学》
查看>>
丰田生产方式和TOC工序切换时间的解决
查看>>
2017年勒索软件、物联网攻击将继续肆虐
查看>>
用友网络董事长王文京为何出现在乌镇大会中?
查看>>
大学团队打造手语翻译机器人,完整安装下来需要149个小时
查看>>