java实现move操作
这类操作与文件所在的文件系统息息相关.
File的renameTo一般只用于同级目录修改文件名。
想要多级目录移动文件还得用Files.move方法。
同一个文件系统下会进行move操作
不同文件系统,则通过拷贝-删除的方式实现move。
package io.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; /** * move-test<br/> * ├── dir1<br/> * │ └── child<br/> * │ └── hui3<br/> * └── hui1<br/> * <p> * move-test<br/> * ├── dir1<br/> * │ └── child<br/> * │ └── hui3<br/> * └── hui2<br/> */ public class MoveTest { public static void main(String[] args) { String root = "/Users/ephuizi/move-test"; Path test1 = Paths.get(root, "hui1"); Path test2 = Paths.get(root, "hui2"); File test1File = test1.toFile(); File test2File = test2.toFile(); //同文件系统,同级目录下,文件重命名 test1File.renameTo(test2File); Path test3 = Paths.get(root, "dir1"); Path test4 = Paths.get(root, "dir2"); try { //多级目录下文件move mvoeDir(test3.toFile(), test4.toFile()); } catch (IOException e) { e.printStackTrace(); } } private static void mvoeDir(File from, File to) throws IOException { File[] children = from.listFiles(); for (File child : children) { Path target = Paths.get(to.getPath(), child.getPath().substring(from.getPath().length())); if (child.isDirectory()) { File targetFile = target.toFile(); if (!targetFile.exists()) { Files.move(child.toPath(), target); } else { if (targetFile.isFile()) { targetFile.delete(); } mvoeDir(child, targetFile); } } else if (child.isFile()) { // Files.move(child.toPath(), target, StandardCopyOption.REPLACE_EXISTING); } } } private static void delDir(File dir) { File[] children = dir.listFiles(); for (File child : children) { if (child.isDirectory()) delDir(child); else child.delete(); } } }