java定時刪除tomcat目錄下的文件

1、在web.xml中添加監聽器

<listener>
    <listener-class>
         com.ydtf.oms.action.monitor.action.excelListener.ExcelTempFileListener
    </listener-class>
</listener>
2、execl.properties
#配置服務器excel文件存放的時間,以分鐘爲單位一天可以這樣表示 :1440(60*24)爲一天,等以此類推  
#10080分鐘,刪除一週前的文件
file_retention_time=10080
#1440分鐘,一天執行一次
every_time_run=1440
3、java類

package com.ydtf.oms.action.monitor.action.excelListener;

import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;


/**
 * 時間監聽器
 * 
 * @author shixf
 * 
 */
public class ExcelTempFileListener implements ServletContextListener {

	private Timer timer;
	private SystemTaskTest systemTask;
	private static String every_time_run;
	static {
		Properties prop = new Properties();
		InputStream inStrem = ExcelTempFileManager.class.getClassLoader()
				.getResourceAsStream("execl.properties");
		try {
			prop.load(inStrem);
			every_time_run = prop.getProperty("every_time_run");

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				inStrem.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	@Override
	// 監聽器初始方法
	public void contextInitialized(ServletContextEvent sce) {
		timer = new Timer();
		systemTask = new SystemTaskTest(sce.getServletContext()
				.getRealPath("/"), sce.getServletContext());
		try {
			sce.getServletContext().log("定時器已啓動");
			String s = "2018-1-8 17:12:00";  
		    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		    Date d = format.parse(s);
			// 設置在每晚24:0分執行任務
			// Calendar calendar = Calendar.getInstance();
			// //calendar.set(Calendar.HOUR_OF_DAY, 24); // 24 ,可以更改時間
			// calendar.set(Calendar.MINUTE, 28); // 0可以更改分數
			// calendar.set(Calendar.SECOND, 0);// 0 //默認爲0,不以秒計
			// Date date = calendar.getTime();
			// 監聽器獲取網站的根目錄
			String path = sce.getServletContext().getRealPath("/");
			   // dstPath = ServletActionContext.getServletContext().getRealPath("/uploadNewTemplate/")+ "\\" + excelName;
			Long time = Long.parseLong(every_time_run) *60 * 1000;// 循環執行的時間
			//System.out.println("time" + time);
			// 第一個參數是要運行的代碼,第二個參數是指定時間執行,只執行一次
			// timer.schedule(systemTask,time);
			// 第一個參數是要運行的代碼,第二個參數是從什麼時候開始運行,第三個參數是每隔多久在運行一次。重複執行
			timer.schedule(systemTask, d, time);
			sce.getServletContext().log("已經添加任務調度表");
		} catch (Exception e) {
		}

	}

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		try {
			timer.cancel();
		} catch (Exception e) {
		}
	}

}
package com.ydtf.oms.action.monitor.action.excelListener;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/**
 * 刪除服務器上的文件
 * 實現Runnable接口(推薦),可以線程接口,預留一個extends(繼承),方便擴展
 * 
 * @author shixf
 */
public class ExcelTempFileManager implements Runnable {

	private static String path;// 路徑

	private static String RETENTION_TIME = "";// 文件保存的時間
	static {
		Properties prop = new Properties();
		InputStream inStrem = ExcelTempFileManager.class.getClassLoader()
				.getResourceAsStream("execl.properties");
		try {
			prop.load(inStrem);
			RETENTION_TIME = prop.getProperty("file_retention_time");

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				inStrem.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 構造函數。初始化參數
	 * 
	 * @param path
	 */
	public ExcelTempFileManager(String path) {
		this.path = path;
	}

	/**
	 * 把線程要執行的代碼放在run()中
	 */
	@Override
	public void run() {
		path = path + "uploadNewTemplate";
		File file = new File(path);
		deletefiles(file);
	}

	/**
	 * 批量刪除文件
	 * 
	 * @param folder
	 */
	public void deletefiles(File folder) {
		File[] files = folder.listFiles();
		for (int i = 0; i < files.length; i++) {
			deleteFile(files[i]);
		}
	}

	/**
	 * 刪除文件
	 * 
	 * @param file
	 */
	private void deleteFile(File file) {
		try {
			if (file.isFile()) {
				// 刪除符合條件的文件
				if (canDeleteFile(file)) {
					if (file.delete()) {
						System.out.println("文件" + file.getName() + "刪除成功!");
					} else {
						System.out.println("文件" + file.getName() + "刪除失敗!此文件可能正在被使用");
					}
				} else {

				}
			} else {
				System.out.println("沒有可以刪除的文件了");
			}

		} catch (Exception e) {
			System.out.println("刪除文件失敗========");
			e.printStackTrace();
		}
	}

	/**
	 * 判斷文件是否能夠被刪除(刪除一週前的文件)
	 */
	private boolean canDeleteFile(File file) {
		Date fileDate = getfileDate(file);
		Date date = new Date();
		long time = (date.getTime() - fileDate.getTime()) / 1000 / 60
				- Integer.parseInt(RETENTION_TIME);// 當前時間與文件間隔的分鐘
		if (time > 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 獲取文件最後的修改時間
	 * 
	 * @param file
	 * @return
	 */
	private Date getfileDate(File file) {
		long modifiedTime = file.lastModified();
		Date d = new Date(modifiedTime);
		return d;
	}

	/**
	 * 格式化日期,沒有用到
	 */
	private String formatDate(Date date) {
		// SimpleDateFormat f=new SimpleDateFormat("yyyyMMdd hh:mm:ss");//12小時制
		SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd HH:mm:ss");// 24小時制
		String formateDate = f.format(date);
		return formateDate;
	}

	/**
	 * 刪除文件夾
	 * 
	 * @param folder
	 */
	public void deleteFolder(File folder) {
		if (folder.isDirectory()) {
			File[] files = folder.listFiles();
			for (int i = 0; i < files.length; i++) {
				deleteFolder(files[i]);
			}

			// 非當前目錄,刪除
			if (!folder.getAbsolutePath().equalsIgnoreCase(path)) {

				// 只刪除在30分鐘前創建的文件
				if (canDeleteFile(folder)) {
					if (folder.delete()) {
						System.out.println("文件夾" + folder.getName() + "刪除成功!");
					} else {
						System.out.println("文件夾" + folder.getName()
								+ "刪除失敗!此文件夾內的文件可能正在被使用");
					}
				}
			}
		} else {
			deleteFile(folder);
		}
	}

}

package com.ydtf.oms.action.monitor.action.excelListener;

import java.util.Date;
import java.util.TimerTask;

import javax.servlet.ServletContext;

/**
 * 時間任務器
 * @author shixf
 *
 */
public class SystemTaskTest extends TimerTask {

	private ServletContext context;  
    private String path;  
    private static String every_time_run;  
    public SystemTaskTest(String path, ServletContext context) {  
        this.path = path;  
        this.context = context;  
    }  
    
	@Override
	/**  
     * 把要定時執行的任務就在run中  
     */  
	public void run() {
		ExcelTempFileManager etf;     
        try {  
            context.log("開始執行任務!");  
            // 需要執行的代碼  
            System.out.println(new Date().toLocaleString());  
            System.out.println("path======" + path);  
            etf = new ExcelTempFileManager(path);  
            etf.run();        
            context.log("指定任務執行完成!");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  

	}

}
4、目錄

5、參考網址

http://blog.csdn.net/lintianlin/article/details/40540831

http://blog.csdn.net/bestcxx/article/details/50298637

http://blog.csdn.net/u012750578/article/details/17346529

https://www.cnblogs.com/hongwz/p/5642429.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章