File的renameTo操作备忘
1.src.renameTo(dest) //java中重命名文件或文件夹的方法。类似于linux中的mv命令。重命名的操作很重要。比如存在下面的场景,一个源将内容同步到目标,并且同时有线程阻塞处理目标中的内容。并且处理的前提条件是目标内容是完全同步过之后才处理。
这种场景最适合renameTo,先将源内容rsync到一个中间的文件夹,然后renameTo中间的文件夹为目标文件夹,应用程序只判断目标文件夹是否存在,一旦存在,就表明里面的内容也是完整的。这样的方式要好于将源直接同步到目标,由于存在同步的过程,导致应用程序读数据错误。
import java.io.File; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestFile implements Runnable { File file; File file2; public TestFile() { try { ExecutorService exec = Executors.newSingleThreadExecutor(); exec.execute(this); exec.shutdown(); } catch (Exception ex) { System.out.println(ex); } } public void init() { System.out.println("do some init"); file = new File("/tmp/middle"); file2 = new File("/tmp/dest"); } public static void main(String[] args) throws Exception { // main用来模拟linux里面的mv操作。这里的main方法可以改良成crontab定时执行mv操作。mv与renameTo一样的重要!!!一样的使用场景。 // linux:当源不存在的时候,会报错。目标路径不存在的话,也没有关系,会按目标路径去重命名。 // windows:不允许应用程序重命名文件夹。本身基于安全和文件索引等考虑。 // 如果dest为null,将抛出NPE. TestFile tf = new TestFile(); tf.init(); System.out.println(tf.file.isDirectory() + "|" + tf.file2.isDirectory()); System.out.println(tf.file.renameTo(tf.file2)); } @Override public void run() { while (true) // block { try { // 每隔1s处理 Thread.sleep(1000); // 如果存在,开始应用程序处理。 if (file2.exists()) { // 模拟应用程序处理数据。 Thread.sleep(1000); // renameTo用来停止应用程序处理。与exist天生一对。 file2.renameTo(file); System.out.println("应用程序处理完数据。"); } } catch (Exception e) { e.printStackTrace(); } } } }