Java实现将指定前缀文件移动到同目录文件夹的方法咨询
解决Java中移动特定前缀文件的问题
首先得修正你现有代码里的一个小问题:d.mkdir()不应该放在accept方法里,不然每次判断一个文件都会执行一次创建目录的操作——虽然重复调用mkdir不会报错,但把它放在外面只执行一次更合理高效。
接下来给你两种常用的文件移动实现方式,优先推荐第一种,更可靠灵活:
方法一:使用Java 7+的NIO Files.move()(推荐)
NIO的Files类提供的move方法是现代、健壮的实现,能处理跨文件系统移动、文件覆盖、原子操作等场景,代码示例如下:
import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; public class FileMoveHandler { public static void main(String[] args) { String currentDir = System.getProperty("user.dir"); File sourceDir = new File(currentDir); File targetFolder = new File(currentDir + File.separator + "TO1"); // 提前创建目标目录(不存在才创建) if (!targetFolder.exists()) { targetFolder.mkdir(); } // 过滤出符合条件的文件(只处理文件,忽略目录) String[] targetFiles = sourceDir.list((dir, fileName) -> { File file = new File(dir, fileName); return file.isFile() && fileName.toLowerCase().startsWith("to1."); }); if (targetFiles != null) { for (String fileName : targetFiles) { Path sourcePath = Paths.get(currentDir, fileName); Path targetPath = Paths.get(targetFolder.getAbsolutePath(), fileName); try { // 执行移动,目标文件已存在则覆盖 Files.move(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING); System.out.println("成功移动:" + fileName); } catch (IOException e) { System.err.println("移动文件失败:" + fileName); e.printStackTrace(); } } } } }
方法二:使用传统的File.renameTo()方法
这是Java早期的实现,代码简单但局限性大(比如跨文件系统移动可能失败,依赖操作系统支持),适合简单场景:
import java.io.File; public class FileRenameMoveHandler { public static void main(String[] args) { String currentDir = System.getProperty("user.dir"); File sourceDir = new File(currentDir); File targetFolder = new File(currentDir + File.separator + "TO1"); if (!targetFolder.exists()) { targetFolder.mkdir(); } String[] targetFiles = sourceDir.list((dir, fileName) -> { File file = new File(dir, fileName); return file.isFile() && fileName.toLowerCase().startsWith("to1."); }); if (targetFiles != null) { for (String fileName : targetFiles) { File sourceFile = new File(currentDir, fileName); File targetFile = new File(targetFolder, fileName); // 执行移动操作 boolean isSuccess = sourceFile.renameTo(targetFile); if (isSuccess) { System.out.println("成功移动:" + fileName); } else { System.err.println("移动失败:" + fileName); } } } } }
额外提醒
- 记得处理
list()返回null的情况(当当前目录不存在或无权限访问时会返回null) - 以上代码只处理当前目录下的文件,如果需要递归处理子目录,你需要额外遍历子目录
Files.move()还支持StandardCopyOption.ATOMIC_MOVE选项,能保证移动操作是原子性的,适合对数据一致性要求高的场景
内容的提问来源于stack exchange,提问作者Vincent Ray Bermejo
相关产品推荐
相关产品推荐

