当前位置: 首页 > article >正文

Java 文件操作

复制文件

实现从源文件路径复制一个文件到另一个目标路径下

首先,使用exists()方法检验输入的源文件是否存在,再使用isFile()方法检验源文件是否是普通文件。
输入目标路径后,再次使用exists()方法检验是否已经存在,防止出现同名,在通过.getParentFile()来检验目标路径的父目录是否存在。
最后进行读取和写入,达到复制的目的。

import java.io.*;
import java.sql.SQLOutput;
import java.util.Scanner;

public class Demo7 {
    public static void main(String[] args){
        // 1.获取用户输入的源文件路径
        System.out.println("请输入源文件路径");
        Scanner scanner = new Scanner(System.in);
        // 获取用户的输入
        String sourcePath = scanner.next();
        // 2.校验文件是否符合要求
        File sourceFile = new File(sourcePath);
        // 是否存在
        if(!sourceFile.exists()){
            System.out.println("输入的源文件不存在");
            return;
        }
        // 是否普通文件
        if(!sourceFile.isFile()){
            System.out.println("输入的源文件不是普通文件");
            return;
        }

        // 3. 用户输入目标文件
        System.out.println("请输入目标文件的路径");
        String destPath = scanner.next();
        // 创建一个文件对象
        File destFile = new File(destPath);
        // 是否存在
        if(destFile.exists()){
            System.out.println("目标文件已存在,请重新输入");
            return;
        }
        // 判断父目录是否存在
        if(!destFile.getParentFile().exists()){
            System.out.println("目标路径的父目录不存在");
            return;
        }
        // 关闭scanner
        scanner.close();
        // 实现读写操作,定义输入流和输出流
        try(InputStream inputStream =new FileInputStream(sourceFile);
        OutputStream outputStream = new FileOutputStream(destFile)){
            // 定义一个数组
            byte[] bytes = new byte[1024];
            // 循环读取源文件
            while (true){
                // 读取
                int len = inputStream.read(bytes);
                if(len == -1){
                    break;
                }
                // 把读到的内容写入目标文件
                outputStream.write(bytes, 0, len);
            }
            outputStream.flush();
            // 打印
            System.out.println("复制成功" + sourcePath + "-->" + destPath);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

扫描关键字

实现在一个目录中扫描文件中或文件名是否包含所给关键字
首先,先通过exists()方法检验输入的路径是否存在,再通过isDirectory()来检验其是否为有效目录。
定义checkFile方法进行文件的检验,使用contains()方法对每个file进行文件名的检验。通过创建StringBuilder来保存Scanner中接收的inputStream的读取。再使用indexOf()方法来判断其中是否包含关键字。所有的包含返回true,不包含返回false。
通过定义scan方法来实现目录的扫描。创建数组File[] files = rootFile.listFiles();通过for each对其中所有文件进行检验。使用checkFile方法来判断文件中或文件名是否包含关键字。如果包含,打印出包含关键字的文件名,通过输入y或n来进行删除。

import java.io.*;
import java.util.Scanner;

public class Demo8 {
    public static void main(String[] args) {
        // 1. 获取要扫描的目录
        System.out.println("请输入要扫描的目录:");
        Scanner scanner = new Scanner(System.in);
        String rootPath = scanner.next();
        // 根据用户的输入创建一个文件对象
        File rootFile = new File(rootPath);
        // 2. 判断路径是否有效
        // 是否存在
        if(!rootFile.exists()){
            System.out.println("输入的路径不存在");
            return;
        }
        // 是否目录
        if(!rootFile.isDirectory()){
            System.out.println("输入的路径不是一个有效目录");
            return;
        }
        // 3. 获取用户输入的关键字
        System.out.println("请输入关键字");
        String keyword = scanner.next();
        // 校验关键字
        if(keyword == null || keyword.isEmpty()){
            System.out.println("输入的关键字不能为空");
            return;
        }

        // 查找过程
        scan(rootFile,keyword);

    }

    private static void scan(File rootFile, String keyword) {
        // 1. 获取扫描目录下的所有子目录和普通文件
        File[] files = rootFile.listFiles();
        // 校验数组是否为空
        if(files.length == 0){
            return;
        }

        // 遍历数组中的所有文件
        for (File file : files){
            // 判断文件是不是普通文件
            if (file.isFile()) {
                // 1. 判断文件是不是普通文件
                // 2. 读取文件内容,内容中是否包含关键字
                boolean bool = checkFile(file, keyword);
                if(!bool){
                    // 没有找到目标文件
                    continue;
                }
                // 接受用户的删除指令
                System.out.println("找到文件" + file.getAbsolutePath() + "包含关键字:" + keyword + ",是否删除?(Y/N)");
                Scanner scanner = new Scanner(System.in);
                String opt = scanner.next();
                if(opt.toLowerCase().equals("y")){
                    //删除操作
                    file.delete();
                    System.out.println("删除文件:" + file.getAbsolutePath() + "成功");
                }
            }else {
                // File是目录, 递归执行
                scan(file, keyword);
            }
        }
    }

    private static boolean checkFile(File file, String keyword) {
        // 1. 判断文件名是否包含关键字
        // 2. 读取文件内容,内容中是否包含关键字
        String fileName = file.getName();
        if(fileName.contains(keyword)){
            // 在文件名中找到了关键字
            return true;
        }
        // 2. 读取文件内容,内容中是否包含关键字
        try(InputStream inputStream = new FileInputStream(file);) {
            // 创建用于保存文件内容的对象
            StringBuilder stringBuilder = new StringBuilder();
            // 创建一个Scanner用来简化文本文件的读取
            Scanner scanner = new Scanner(inputStream);
            while (true){
                // 判断文件是否到结尾
                if(!scanner.hasNextLine()){
                    break;
                }
                // 把内容添加到stringBuilder中
                stringBuilder.append(scanner.nextLine());
            }
            // 校验内容中是否包含关键字
            if (stringBuilder.indexOf(keyword) > -1) {
                return true;
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 文件不符合查找要求
        return false;
    }
}


http://www.kler.cn/a/508963.html

相关文章:

  • Mybatis面试题
  • Docker私有仓库管理工具Registry
  • 从玩具到工业控制--51单片机的跨界传奇【3】
  • 用 Python 自动化处理日常任务
  • 基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
  • 在Mac mini上实现本地话部署AI和知识库
  • 【蓝桥杯】43689.包子凑数
  • 【Vue】vue3 video 保存视频进度,每次进入加载上次的视频进度
  • Linux的几个基本指令
  • 【华为战报】2024年12月 HCIP考试战报!
  • PHP版接口调试工具(自定义GET|POST|COOKIE|HEADER|User Agent|来路Referer)
  • 【20】Word:小许-质量管理-论文❗
  • 免费送源码:Java+ssm+MySQL 图书借阅管理系统的设计与实现 计算机毕业设计原创定制
  • 云部署服务器
  • 【青海省乡镇界】面图层+shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移下载内容测评
  • 【React】class组件extends继承原理
  • Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普
  • 使用Python爬虫获取1688网站item_get_company API接口的公司档案信息
  • 自学SpringBoot笔记
  • AIGC与劳动力市场:技术进步与就业结构的重塑
  • LeetCode 热题 100_子集(56_78_中等_C++)(回溯)(ans.clear())
  • Linux操作命令之Nginx基本功能
  • 搜维尔科技:Haption遥操作解决方案特点和优势
  • 实在RPA研究|万字解析实在RPA:概念、原理、优势、场景及与爬虫、python区别
  • User analysis 思考,持续 几秒 如何看待自动驾驶技术的现状与未来:挑战与机遇
  • 游戏引擎学习第82天