zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
     
  • 相关阅读:
    空间距离计算
    一种支持多种并行环境的栅格地理计算并行算子
    发布或重启线上服务时抖动问题解决方案
    jetty9优化的两处地方
    mysql空间扩展 VS PostGIS
    多流向算法GPU并行化
    GDAL并行I/O
    深入浅出空间索引:2
    深入浅出空间索引:为什么需要空间索引
    virtualBox中的centOS虚拟机硬盘扩容
  • 原文地址:https://www.cnblogs.com/highriver/p/2440771.html
Copyright © 2011-2022 走看看