Java 15中多文件跨文件夹复制遇FileAlreadyExistsException的解决方案咨询
解决Java复制文件夹中TXT文件到目标文件夹的问题
我来帮你搞定这个复制文件的问题!你遇到的java.nio.file.FileAlreadyExistsException确实是因为目标路径处理错误——你现在的代码是直接把源文件复制到目标文件夹路径本身,而不是在目标文件夹内部创建同名文件,这就导致了冲突。咱们按照拖拽操作的逻辑来修改代码:
核心问题分析
当你调用Files.copy(fileorDir, dst)时,如果dst是文件夹路径,Java会尝试把源文件替换成这个文件夹(显然不允许);如果dst是具体文件路径,循环到第二个文件时又会尝试覆盖同一个文件,自然抛出已存在的异常。正确的做法是为每个源文件在目标文件夹下生成对应的目标路径。
解决方案步骤
确保目标文件夹存在
如果目标文件夹./trash不存在,Files.copy会直接失败,所以先创建它(包括所有父目录):Files.createDirectories(dst);只筛选TXT文件
你只需要复制文本文件,创建DirectoryStream时可以直接加过滤条件,避免遍历无关文件:DirectoryStream<Path> ds = Files.newDirectoryStream(src, "*.txt");构建正确的目标路径
对每个源文件,用dst.resolve(fileorDir.getFileName())生成目标路径——这个方法会自动把源文件的文件名拼接到目标文件夹路径后面,完全模拟拖拽时的行为。处理已存在的文件
如果目标文件夹里有同名文件,默认的Files.copy会抛出异常,你可以通过复制选项控制行为:StandardCopyOption.REPLACE_EXISTING:覆盖已存在的文件StandardCopyOption.IGNORE_EXISTING:跳过已存在的文件StandardCopyOption.COPY_ATTRIBUTES:复制文件属性(比如修改时间)
修改后的完整代码
import java.nio.file.*; import java.io.IOException; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; public class FileCopyExample { public static void main(String[] args) { Path src = Paths.get("./resources"); Path dst = Paths.get("./trash"); try { // 确保目标文件夹存在,不存在则创建 Files.createDirectories(dst); // 只遍历源文件夹下的TXT文件,同时用try-with-resources自动关闭流 try (DirectoryStream<Path> ds = Files.newDirectoryStream(src, "*.txt")) { for (Path txtFile : ds) { // 构建目标路径:目标文件夹 + 源文件名 Path targetPath = dst.resolve(txtFile.getFileName()); System.out.println("复制文件: " + txtFile + " -> " + targetPath); // 复制文件,覆盖已存在的同名文件 Files.copy(txtFile, targetPath, REPLACE_EXISTING); } } } catch (IOException ioe) { ioe.printStackTrace(); } } }
额外说明
- 我用了try-with-resources来管理
DirectoryStream,这样不用手动关闭流,代码更安全简洁。 - 如果你不想覆盖已存在的文件,把
REPLACE_EXISTING换成IGNORE_EXISTING即可,或者不加选项(遇到同名文件就抛出异常,由你决定)。
这样修改后,代码就完全实现了像拖拽操作那样,把源文件夹中的所有TXT文件复制到目标文件夹里啦!
内容的提问来源于stack exchange,提问作者Fugazzie
相关产品推荐
相关产品推荐

