文件剪切 及 timertask 定时任务

来源:互联网 发布:服务器装centos 编辑:程序博客网 时间:2024/05/29 10:04
public static void fileMove(String from, String to, String longtime) throws Exception {// 移动指定文件夹内的全部文件  
           try {  
               File dir = new File(from);  
               File[] files = dir.listFiles();// 将文件或文件夹放入文件集  
               if (files == null)// 判断文件集是否为空  
                   return;  
               File moveDir = new File(to);// 创建目标目录  
               if (!moveDir.exists()) {// 判断目标目录是否存在  
                   moveDir.mkdirs();// 不存在则创建  
               }  
               for (int i = 0; i < files.length; i++) {// 遍历文件集  
                   if (files[i].isDirectory()) {// 如果是文件夹或目录,则递归调用fileMove方法,直到获得目录下的文件  
                       System.out.println("filename:"+files[i].getName()+",isValidDate:"+DateUtil.isValidDate(files[i].getName()));
                       if(!DateUtil.isValidDate(files[i].getName())){//判断此文件夹是否是一个合法时间格式
                           fileMove(files[i].getPath(), to + "\\" + files[i].getName(),longtime);// 递归移动文件

                       }

                       //判断此文件夹是否是一个合法时间格式 且 计算一个时间差值 和页面上一值做比较

                       if(DateUtil.isValidDate(files[i].getName()) && DateUtil.getDateLong(DateUtil.strToDate(files[i].getName()),new Date())>Integer.parseInt(longtime) ){
                           files[i].delete();//删除文件所在原目录   
                       }
                   }  
                   File moveFile = new File(moveDir.getPath() + "\\"+ files[i].getName());  // 将文件目录放入移动后的目录  
                   if (moveFile.exists()) {// 目标文件夹下存在的话,删除  
                       moveFile.delete();  
                   }
                   if(DateUtil.isValidDate(files[i].getName()) && DateUtil.getDateLong(DateUtil.strToDate(files[i].getName()),new Date())>Integer.parseInt(longtime)){
                       files[i].renameTo(moveFile);// 移动文件  
                       System.out.println("文件:"+  files[i]+"移动成功");
                   }
               }  
           } catch (Exception e) {  
               throw e;  
           }  

       }  

/**
     * 判定字符串是否是合法时间格式
     * @param str
     * @return
     */
    public static boolean isValidDate(String str) {
        boolean convertSuccess=true;
        // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
         SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
         try {
             // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
            format.setLenient(false);
            format.parse(str);
         } catch (ParseException e) {
            // e.printStackTrace();
             // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
             convertSuccess=false;
         }
         return convertSuccess;
  }


其中的if判断安个人需求, 这个可完全去掉的, 我的业务是只剪切 时间为格式的文件夹 (格式:yyyyMMdd   例如: 20150114) 并在目标文件夹创建父级目录

个人感觉很多例子都是先复制 后 删除。  这个例子是 直接剪切的一个动作 , 如果你是操作大文件 也许会有优势吧。

同时 还学习 一个定时 任务。 timertask  感觉还不错 也就记录下来了。


package  cn.lky.lygf.datamanage.datamigration.service.impl;

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

import cn.lky.lygf.datamanage.datamigration.bean.DataDirectory;
import cn.lky.lygf.utils.FileUtil;

/**
* Simple demo that uses java.util.Timer to schedule a task to execute
* once 5 seconds have passed.
*/

public class Reminder {
//    private DataDirectory dataDirectory = (DataDirectory)ApplicationContextUtil.getBean("dataDirectory");
    Timer timer;
    DataDirectory dataDirectoryTwo;

    public Reminder(DataDirectory dataDirectory) {
        dataDirectoryTwo=dataDirectory;
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dataDirectory.getRunTime()));
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date time = calendar.getTime();
        timer = new Timer();
        timer.schedule(new RemindTask(), time, 24*60*60*1000);
    }
    class RemindTask extends TimerTask {
        public void run() {
            try {
                FileUtil.fileMove(dataDirectoryTwo.getSourceDirectory(), dataDirectoryTwo.getTargeDirectory(),dataDirectoryTwo.getTimeMove());//调用文件剪切方法
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          //  timer.cancel(); //Terminate the timer thread
        }
    }
}


方法:timer.schedule(new RemindTask(), time, 24*60*60*1000);

三个参数 第一个不是很清楚怎样解释 反正就是new一个实体  他需继承TimerTask类   第二个参数为延迟多长时间执行第一次执行run方法 也可以说指定什么时候第一次执行你的业务逻辑 此处我是扫描我上处文件剪切的方法  第三个参数  就是 每隔多长时间执行一次了     如需重复执行  不可加此方法//  timer.cancel(); 

0 0
原创粉丝点击