Java实现1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制

简介: Java实现1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制
package JAVA做一个文件管理器;
import java.io.*;
import java.util.Scanner;
public class FileUtils {
    public static void main(String[] args) throws IOException {
        /** * 复制文件夹或文件夹 */
        // 源文件夹
        String url1 = "f:/photos";
        // 目标文件夹
        String url2 = "d:/tempPhotos";
            // 创建目标文件夹
            (new File(url2)).mkdirs();
            // 获取源文件夹当前下的文件或目录
            File[] file = (new File(url1)).listFiles();
            for (int i = 0; i < file.length; i++) {
                if (file[i].isFile()) {
                    // 复制文件
                    copyFile(file[i],new File(url2+file[i].getName()));
                }
                if (file[i].isDirectory()) {
                    // 复制目录
                    String sourceDir=url1+File.separator+file[i].getName();
                    String targetDir=url2+File.separator+file[i].getName();
                    copyDirectiory(sourceDir, targetDir);
                }
            }
        //输出语句(显示操作菜单)
       System.out.println("**********1.指定关键字搜索 2.指定后缀名搜索 3.文件/文件夹复制   4.退出***********************");
        System.out.println("请输入对应的操作");
        //创建一个键盘扫描器
        Scanner sc = new Scanner(System.in);
        //接收用户的输入整数
        int key = sc.nextInt();
        //根据用户判断是哪一操作
        //在等值比较的时候,优先考虑switch..case,但使用switch的时候一定要注意
        //int char String 枚举
        //byte short int char String 枚举
        switch (key){
            case 1:
                //TODO 根据关键字搜索文件
                searchByKeyWorld();
                break;
            case 2:
                //TODO  根据指定的后缀名搜索文件
                searchByLastWord();
                break;
            case 3:
                //TODO  文件/文件夹的复制
                break;
            case 4:
                //退出
                System.exit(0);//中止
                break;
            default:
                System.out.println("操作错误,请输入正确指令");
                break;
        }
    }
    private static void searchByLastWord() {
//提醒用户输入需要搜索的目录
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要检索的目录:");
        //再提醒用户输入需要搜索的后缀
        String path = sc.nextLine();
        System.out.println("请输入要检索的后缀");
        String key = sc.nextLine();
        File file = new File(path);
        //通过用户指定的目录去搜索后缀
        listSuffix(file,key);
        //告诉用户是否搜索到文件
        System.out.println("搜完了!");
    }
    private static void listSuffix(File file, String key) {
        //获取当前目录所有File对象
        File[] files = file.listFiles();
        //把每一个file对象拿出来判断,首先判断是目录还是文件,
        //如果是目录则继续搜索,文件则判断是否包含关键字
        for (File file2 :files) {//JDK1.8新推出集合流式Api处理 集合Lambda表达式效果更佳
            //判断元素是否是后缀
            String exegc ="^"+key+"$";
            if (file2.isDirectory()){
                listFile(file2,key);
            }else {
                if (file2.getName().endsWith(exegc)){
                    System.out.println(file2.getAbsolutePath());
                }
            }
        }
    }
    private static void searchByKeyWorld() {
        //提醒用户输入需要搜索的目录
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要检索的目录:");
        //再提醒用户输入需要搜索的关键字
        String path = sc.nextLine();
        System.out.println("请输入要检索的关键字");
        String key = sc.nextLine();
        File file = new File(path);
        //通过用户指定的目录去搜索指定关键字
        listFile(file,key);
        //告诉用户是否搜索到文件
        System.out.println("搜完了!");
    }
    //具体搜索关键字的方法
    private static void listFile(File file, String key) {
        //获取当前目录所有File对象
        File[] files = file.listFiles();
        //把每一个file对象拿出来判断,首先判断是目录还是文件,
        //如果是目录则继续搜索,文件则判断是否包含关键字
        for (File file2 :files) {//JDK1.8新推出集合流式Api处理 集合Lambda表达式效果更佳
            //判断元素是否是目录
            if (file2.isDirectory()){
                listFile(file2,key);
            }else {
                if (file2.getName().contains(key)){
                    System.out.println(file2.getAbsolutePath());
                }
            }
        }
    }
        // 复制文件
        public static void copyFile(File sourceFile,File targetFile) throws IOException{
            // 新建文件输入流并对它进行缓冲
            FileInputStream input = new FileInputStream(sourceFile);
            BufferedInputStream inBuff=new BufferedInputStream(input);
            // 新建文件输出流并对它进行缓冲
            FileOutputStream output = new FileOutputStream(targetFile);
            BufferedOutputStream outBuff=new BufferedOutputStream(output);
            // 缓冲数组
            byte[] b = new byte[1024 * 5];
            int len;
            while ((len =inBuff.read(b)) != -1) {
                outBuff.write(b, 0, len);
            }
            // 刷新此缓冲的输出流
            outBuff.flush();
            //关闭流
            inBuff.close();
            outBuff.close();
            output.close();
            input.close();
        }
        // 复制文件夹
        public static void copyDirectiory(String sourceDir, String targetDir) throws IOException {
            // 新建目标目录
            (new File(targetDir)).mkdirs();
            // 获取源文件夹当前下的文件或目录
            File[] file = (new File(sourceDir)).listFiles();
            for (int i = 0; i < file.length; i++) {
                if (file[i].isFile()) {
                    // 源文件
                    File sourceFile=file[i];
                    // 目标文件
                    File targetFile=new File(new File(targetDir).getAbsolutePath() +File.separator+file[i].getName());
                    copyFile(sourceFile,targetFile);
                }
                if (file[i].isDirectory()) {
                    // 准备复制的源文件夹
                    String dir1=sourceDir + "/" + file[i].getName();
                    // 准备复制的目标文件夹
                    String dir2=targetDir + "/"+ file[i].getName();
                    copyDirectiory(dir1, dir2);
                }
            }
        }
    }

 


目录
相关文章
|
2月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
79 9
|
3天前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
47 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
11天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
24天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
11天前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2100 3
|
2月前
|
JavaScript 前端开发 Java
java中的this关键字
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。自学前端2年半,正向全栈进发。若我的文章对你有帮助,欢迎关注,持续更新中!🎉🎉🎉
55 9
|
2月前
|
设计模式 JavaScript 前端开发
java中的static关键字
欢迎来到瑞雨溪的博客,博主是一名热爱JavaScript和Vue的大一学生,致力于全栈开发。如果你从我的文章中受益,欢迎关注我,将持续分享更多优质内容。你的支持是我前进的动力!🎉🎉🎉
56 8
|
2月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
44 3
|
9天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
11天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。