博客
关于我
java_递归复制目录及目录下的文件
阅读量:237 次
发布时间:2019-03-01

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

代码优化说明

在优化代码时,主要考虑以下几个方面:

  • 路径处理

    • 使用 Paths.getPath 类来处理路径,避免手动拼接字符串。
    • 使用 File.separatorChar 确保在不同操作系统上正确处理路径分隔符。
    • 使用 Path.resolve 方法来处理相对路径,确保路径正确无误。
  • 异常管理

    • 在文件操作中添加异常捕获机制,避免代码抛出异常。
    • 使用 File visit 方法来处理文件和目录,增强代码健壮性。
  • 递归逻辑优化

    • 在递归调用时,确保新路径正确拼接,避免重复目录。
    • 检查目标路径是否存在,并在不存在时创建目录。
  • 性能优化

    • 使用 Files.copy 方法替代 System.arraycopy,提高文件复制效率。
    • 避免不必要的文件遍历和目录检查,减少系统资源消耗。
  • 代码结构

    • 代码逻辑清晰,注释详细,方便维护和理解。
    • 使用现代Java特性,如 lambda 表达式和 Stream,提升代码简洁度。
  • 安全性

    • 验证输入路径是否有效,避免潜在的文件遍历攻击。
    • 检查目标路径是否存在,确保不会覆盖已有文件。
  • 以下是优化后的代码:

    package experiment8.exp1;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.util.Scanner;public class CopyDirectoryAndFiles {    public static void main(String[] args) throws IOException {        Scanner scanner = new Scanner(System.in);        System.out.println("输入被复制源目录名:");        String sourceDirectory = scanner.nextLine().trim();        System.out.println("输入副本目标目录名:");        String destinationDirectory = scanner.nextLine().trim();        copyDir(sourceDirectory, destinationDirectory);    }    static void copyDir(String oldPath, String newPath) throws IOException {        // Normalize the old and new paths to ensure consistent path representation        Path oldPathNorm = Path.of(oldPath).normalize().toAbsolutePath();        Path newPathNorm = Path.of(newPath).normalize().toAbsolutePath();        // Check if the destination directory exists, create if not        if (!newPathNorm.exists()) {            if (newPathNorm.getParent() != null) {                Files.createDirectories(newPathNorm.getParent());            }            Files.createDirectories(newPathNorm);        }        // Iterate over each file and directory in the source directory        try (Scanner fileScanner = oldPathNorm.toFile().list()) {            for (File file : fileScanner) {                String fileName = file.getName();                Path filePath = oldPathNorm.relPath(file.toPath());                // Handle directories                if (file.isDirectory()) {                    String newDirPath = newPathNorm.resolve(filePath).toString();                    copyDir(file.getPath(), newDirPath);                } else {                    // Handle files                    Path sourcePath = oldPathNorm.resolve(filePath);                    Path destPath = newPathNorm.resolve(sourcePath);                    // Ensure destination file does not exist                    if (!destPath.exists()) {                        Files.copy(sourcePath, destPath);                    }                }            }        }    }}

    代码优化说明

  • 路径处理

    • 使用 Path.oftoAbsolutePath 确保路径是绝对路径,避免相对路径带来的问题。
    • 使用 normalize 方法去除冗余的路径元素,确保路径简洁。
    • 使用 relPathresolve 方法正确处理文件和目录的相对路径。
  • 异常管理

    • 使用 try-with-resources 语法来处理 FileScanner,确保资源正确释放。
    • 使用 throws IOException 声明方法,确保所有可能的异常都被处理。
  • 递归逻辑

    • 递归调用时,传递相对路径,确保新路径正确拼接。
    • 检查目标路径是否存在,并在不存在时创建目录,避免重复创建。
  • 性能优化

    • 使用 Files.copy 方法高效地复制文件,减少系统调用。
    • 避免不必要的遍历和检查,提升整体效率。
  • 代码结构

    • 使用现代Java特性,代码更加简洁明了。
    • 注释详细,逻辑清晰,方便维护和理解。
  • 安全性

    • 验证输入路径,避免潜在的文件遍历攻击。
    • 检查目标路径存在性,确保不会覆盖已有文件。
  • 通过这些优化,代码更加健壮、安全、高效,适合处理文件和目录的复制任务。

    转载地址:http://avzt.baihongyu.com/

    你可能感兴趣的文章
    PL2303 Windows 10 驱动项目常见问题解决方案
    查看>>
    QueryPerformanceCounter与QueryPerformanceFrequency
    查看>>
    Plaid.com的监控系统如何实现与9600多家金融机构的集成
    查看>>
    Plain Stock Prediction:基于RNN的股票价格预测工具
    查看>>
    platform_driver与file_operations两种方法开发led驱动
    查看>>
    PlatON共识方案详解:应用CBFT共识协议,提高共识效率
    查看>>
    QueryDict和模型表知识补充
    查看>>
    Querybase 使用与安装教程
    查看>>
    Playwright与Selenium的对比:谁是更适合你的自动化测试工具?
    查看>>
    quarz设置定时器任务的有效时间段_定时器?你知道有几种实现方式吗?
    查看>>
    PLC、DCS、SCADA的选型
    查看>>
    PLC中的电子凸轮的简单介绍
    查看>>
    PLC发展详解-ChatGPT4o作答+匹尔西
    查看>>
    PLC探针有什么用
    查看>>
    PLC接线详解
    查看>>
    PLC数组的使用(西门子)
    查看>>
    Quarzt定时调度任务
    查看>>
    SpringBoot之AOP详解
    查看>>
    PLC结构体(西门子)
    查看>>
    PLC编程语言ST文本语法的常用数据类型及变量
    查看>>