Java文件操作小案例

一:指定一个目录,扫描这个目录,找到文件名中包含了指定字符的文件,并提示用户是否要删除这个文件。根据用户的输入决定是否删除。

public static void main(String[] args) throws IOException {
        // 1.让用户指定一个待扫描的根目录 和 要查询的关键词
        System.out.println("请输入要扫描的根目录(绝对路径):");
        Scanner scanner = new Scanner(System.in);
        String root = scanner.next();
        File rootDir = new File(root);
        if(!rootDir.isDirectory()){
            System.out.println("你输入的路径错误!程序直接退出");
            return;
        }
        System.out.println("请输入要查找的文件名中包含的关键词:");
        String token = scanner.next();

        // 2.递归的遍历目录
        // result表示递归遍历的结果,就包含着所有带有token关键词的文件名
        List<File> result = new ArrayList<>();
        scanDir(rootDir,token,result);

        // 3.遍历result,问用户是否要删除该文件,根据用户的输入决定是否删除。
        for (File f: result) {
            System.out.println(f.getCanonicalPath()+"是否要删除?(Y/n)");
            String input = scanner.next();
            if(input.equals("Y")){
                f.delete();
            }
        }
    }
    // 递归的来遍历目录,找出里面所有符合条件的文件
    private static void scanDir(File rootDir, String token, List<File> result) throws IOException {
        // list返回的是一个文件名(String),使用listFiles直接得到的是File对象,用起来更方便一起
        File[] files = rootDir.listFiles();
        if(files == null || files.length == 0){
            // 当前的目录是一个空的目录
            return;
        }
        for(File f:files){
            if(f.isDirectory()){
                // 如果当前的文件是一个目录,就递归的进行查找
                scanDir(f,token,result);
            }else {
                // 如果当前文件是一个普通的文件,就判定这个文件是否包含了待查找的关键词
                if(f.getName().contains(token)){
                    result.add(f.getCanonicalFile());
                }
            }
        }
    }

二:复制一个文件,启动程序之后,让用户输入一个文件的路径(绝对路径)要求这个文件是一个普通文件,不是目录。然后在指定一个要复制过去的目标目录,通过程序,把这个文件给进行复制。

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要复制的文件:(绝对路径)");
        String srcPath = scanner.next();
        File srcFile = new File(srcPath);
        if(!srcFile.isFile()){
            System.out.println("文件路径错误!程序直接退出");
            return;
        }
        System.out.println("请输入要复制到的目标路径:(绝对路径)");
        String destPath = scanner.next();
        //要求这个 destFile必须不能存在
        File destFile = new File(destPath);
        if(destFile.exists()){
            System.out.println("目标文件的路径已经存在!程序直接退出!");
            return;
        }
        if(!destFile.getParentFile().exists()){
            // 父级目录不存在,也提示一个报错,也可以不存在就创建出来。使用mkdirs就能创建
            System.out.println("目标文件的父目录不存在!程序直接退出!");
            return;
        }
        // 具体进行复制操作
        // 复制操作就是打开待复制的文件,读取出每个字节,然后再把这些字节给写入到目标的文件中
        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(destFile)){
            // 从inputStream中按照字节来读,然后把结果写入到outputStream中
            while(true){
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);
                if(len == -1){
                    break;
                }
                outputStream.write(buffer,0,len);
            }
            // 如果这里不加flush,触发close操作,也会自动刷新缓冲区
            outputStream.flush();
        }catch (IOException e){
            e.printStackTrace();
        }
        System.out.println("复制完成!");
    }
  • 只有实现了Closeable接口的才能放在try( )里面
    在这里插入图片描述
    通过文件操作,在指定目录中按照文件名和文件内容查看,看是否有匹配的文件
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 1.让用户输入一个路径,待搜索的路径
        System.out.println("请输入要扫描的根目录:");
        String rootDir = scanner.next();
        File rootFile = new File(rootDir);
        if(!rootFile.isDirectory()){
            System.out.println("该目录不存在或者不是文件!字节退出");
        }
        // 2.再让用户输入一个查询词,表示要搜索的结果中要包含这个词
        System.out.println("请输入要查询的词:");
        String query = scanner.next();
        // 3.遍历目录以及文件,进行匹配
        List<File> results = new ArrayList<>();
        scanDirWithContent(rootFile,query,results);
    }

    private static void scanDirWithContent(File rootFile, String query, List<File> results) {
        File[] files = rootFile.listFiles();
        if(files == null || files.length == 0){
            // 针对空的目录,字节返回
            return;
        }
        for (File f:files){
            if(f.isDirectory()){
                scanDirWithContent(f,query,results);
            }else {
                if(f.getName().contains(query)){
                    // 看看文件名称中是否包含
                    results.add(f);
                } else if(isContentContains(f,query)){
                    // 看看文件内容中是否包含
                    results.add(f);
                }
            }
        }
    }

    private static boolean isContentContains(File f, String query) {
        // 打开f这个文件,依次取出每一行结果,去和query来进行一个indexof
        StringBuilder stringBuilder = new StringBuilder();

        try(InputStream inputStream = new FileInputStream(f)){
            Scanner scanner = new Scanner(inputStream,"UTF-8");
            while (scanner.hasNextLine()){
                String line = scanner.nextLine();
                stringBuilder.append(line+"\n");
            }
        }catch (IOException e){
            e.printStackTrace();
        }
        // 只要结果不等于 -1,就说明查到了
        return stringBuilder.indexOf(query) != -1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值