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();
            }
        }
    }
}

 

 

 
posted @ 2012-04-10 16:18  highriver  阅读(919)  评论(0编辑  收藏  举报