java监听器定时删除,java监听器定时删除服务器上的文件

实现思想:

1、配置一个ServletContextListener监听器

2、在监听器上配置一个定时器,用来执行定时任务

3、在任务管理器配置任务

实现代码:

Listener监听器类:

package com.chinacreator.report.listener;

import java.io.IOException;

import java.io.InputStream;

import java.util.Calendar;

import java.util.Date;

import java.util.Properties;

import java.util.Timer;

import java.util.TimerTask;

import javax.servlet.ServletContext;

import javax.servlet.ServletContextEvent;

import javax.servlet.ServletContextListener;

import com.chinacreator.report.thread.ExcelTempFileManager;

/**

* 时间监听器

*

* @author xiaoqun.yi

*/

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

}

}

}

// 监听器初始方法,不要弄错了

public void contextInitialized(ServletContextEvent sce) {

timer = new Timer();

systemTask = new SystemTaskTest(sce.getServletContext()

.getRealPath("/"), sce.getServletContext());

try {

sce.getServletContext().log("定时器已启动");

// 设置在每晚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("/");

Long time = Long.parseLong(every_time_run) * 1000;// 循环执行的时间

System.out.println("time" + time);

// 第一个参数是要运行的代码,第二个参数是指定时间执行,只执行一次

// timer.schedule(systemTask,time);

// 第一个参数是要运行的代码,第二个参数是从什么时候开始运行,第三个参数是每隔多久在运行一次。重复执行

timer.schedule(systemTask, 10000, time);

sce.getServletContext().log("已经添加任务调度表");

} catch (Exception e) {

}

}

public void contextDestroyed(ServletContextEvent sce) {

try {

timer.cancel();

} catch (Exception e) {

}

}

}

/**

* 时间任务器

*

* @author xiaoqun.yi

*/

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;

}

/**

* 把要定时执行的任务就在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();

}

}

}

execl.properties

#配置服务器excel文件存放的时间,以分钟为单位一天可以这样表示 :1440(60*24)为一天,等以此类推

file_retention_time=60

#一個小時執行一次

every_time_run=60package com.chinacreator.report.thread;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Properties;

/**

* 删除服务器上的文件

* @author xiaoqun.yi

*/

//实现Runnable接口(推荐),可以线程接口,预留一个extends(继承),方便扩展

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;

System.out.println("path____________________" + path);

}

/**

* 把线程要执行的代码放在run()中

*/

public void run() {

System.out.println("文件管理开始=========");

path = path + "exportExcel";

System.out.println("path?????" + path);

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

}

}

}

web.xml中文件配置:

com.chinacreator.report.listener.ExcelTempFileListener

运行演示图:(本人更改的执行时间为23:17,方便演示)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值