2019年06月19日(星期三)  农历:己亥年五月十七
  • 首页
  • JAVA
  • java监听器定时删除服务器上的文件

作者:三年。分类: JAVA

实现思想:

1、配置一个ServletContextListener监听器

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

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

实现代码:

Listener监听器类:

package com.chinacreator.report.listener;

import java.util.Calendar;

import java.util.Date;

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 = new Timer();

public static ServletContext servletContext;

public void contextInitialized(ServletContextEvent sce) {

this.servletContext = sce.getServletContext();

try {

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

// timer.schedule(new SystemTaskTest(),0,(5*1000));

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

// 设置在每晚24:0分执行任务

Calendar calendar = Calendar.getInstance();

calendar.set(Calendar.HOUR_OF_DAY, 24); // 24 ,可以更改时间

calendar.set(Calendar.MINUTE, 0); // 0可以更改分数

calendar.set(Calendar.SECOND, 0);// 0 //默认为0,不以秒计

Date date = calendar.getTime();

// 监听器获取网站的根目录

String path = sce.getServletContext().getRealPath("/");

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

timer.schedule(new SystemTaskTest(path), date);

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 String path;

public SystemTaskTest(String path) {

this.path = path;

}

/**


* 把要定时执行的任务就在run中

*/

public void run() {

try {

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

System.out.println("date===" + new Date().getMinutes());

for (int i = 0; i < 10; i++) {

System.out.println("say hello");

}

ExcelTempFileManager etf = new ExcelTempFileManager(path);

etf.run();

} catch (Exception e) {

e.printStackTrace();

}

}

}

execl.properties

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

file_retention_time=60

删除服务器的文件类:

package 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/2794 人参与

发表评论:



手Q扫描加入Java初学者群