你会去创建一个线程去处理压缩日志并删除吗?
代码如下
package weaver.general;;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.concurrent.TimeUnit;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;public class ZipCompressThread implements Runnable {Log log=LogFactory.getLog(this.getClass());private String logRootPath;private static final String ECOLOGY = "ecology";private static final String INTEGRATION = "integration";private static final String ECO_PREFFIX = File.separator + "ecology_";private static final String INTERG_PREFFIX = File.separator + "integration_";private static final String INTERG_CATE_PREFFIX = File.separator + "integration";private static final String ZIP_SUFFIX = ".zip";private static final String LOG_SUFFIX = ".log";private static final String LOG = "log";private boolean flag = false;private int hour = 2;private String date = getDate();//给1小时压缩空挡int nextHour = 3;//logRoot: "C:\\MY_IDEA\\demo_01\\ecology\\log"public ZipCompressThread(String logRoot) {this.logRootPath = logRoot;}@Overridepublic void run() {while (true) {if (LocalTime.now().getHour() == hour) {if (!flag) {flag = true;ecologyZipCompress(logRootPath);integrationCompress(logRootPath + INTERG_CATE_PREFFIX);}try {TimeUnit.MINUTES.sleep(15);} catch (InterruptedException e) {e.printStackTrace();}if (LocalTime.now().getHour() == nextHour) {flag = false;}}}}public void ecologyZipCompress(String logRootPath) {createFilePath(logRootPath);}public void integrationCompress(String interationPath) {createFilePath(interationPath);}private void createFilePath(String catagoryPath) {String filePath = null;File catagory = new File(catagoryPath);File[] fileList = catagory.listFiles();if (catagory.exists()) {for (File file : fileList) {if (file.getName().endsWith(date + LOG_SUFFIX)) {filePath = file.toString();log.info("日志文件目录是:" + filePath);//System.out.println("日志文件目录是:" + filePath);break;}}}createZipAndDeleteLog(filePath, catagoryPath);}private void createZipAndDeleteLog(String filePath, String catagoryPath) {FileInputStream fis = null;FileOutputStream fos = null;ZipOutputStream zos = null;Boolean isZip = false;String target = zipTargetPath(catagoryPath);if (null != filePath) {//targetFile压缩的log日志全路径File targetFile = new File(filePath);try {//目标zip文件(包括路径写入文件输出流)fos = new FileOutputStream(target);//封装进zip输出流zos = new ZipOutputStream(fos);if (targetFile.exists()) {try {//log文件建立输出流fis = new FileInputStream(targetFile);ZipEntry ze = new ZipEntry(targetFile.getName());zos.putNextEntry(ze);byte[] content = new byte[1024];int len;while ((len = fis.read(content)) != -1) {zos.write(content, 0, len);zos.flush();}} catch (IOException e) {log.info(filePath + "日志压缩写入zip文件异常!");//System.out.println(filePath + "日志压缩写入zip文件异常!");} finally {try {if (fis != null) {fis.close();}} catch (IOException e) {log.info(filePath + "日志压缩输入流关闭异常!");//System.out.println(filePath + "日志压缩输入流关闭异常!");}}}} catch (Exception e) {e.printStackTrace();} finally {try {if (zos != null) {zos.close();}} catch (IOException e) {log.info(filePath + "日志压缩输出流关闭异常!");//System.out.println(filePath + "日志压缩输出流关闭异常!");}}File catagory = new File(catagoryPath);File[] flashfileList = catagory.listFiles();for (File file : flashfileList) {if (file.getName().endsWith(date + ZIP_SUFFIX)) {isZip = true;break;}}isDelete(isZip, targetFile);} else {if (filePath == null) {log.info(target + "日志前一天日志已经压缩并删除!");//System.out.println(target + "日志前一天日志已经压缩并删除!");} else {log.info(filePath + "日志前一天日志已经压缩并删除!");//System.out.println(filePath + "日志前一天日志已经压缩并删除!");}}}/*** 设置压缩的目标文件名称*/private String zipTargetPath(String logRoot) {String date = getDate();if (logRoot.endsWith(File.separator + ECOLOGY + File.separator + LOG)) {return logRoot + ECO_PREFFIX + date + ZIP_SUFFIX;} else {return logRoot + INTERG_PREFFIX + date + ZIP_SUFFIX;}}/*** 获取日志20200720** @return*/private String getDate() {return LocalDate.now().minusDays(1).toString().replace("-", "");}private void isDelete(boolean isZip, File targetFile) {if (isZip) {if (LOG.equals(targetFile.getParentFile().getName()) && ECOLOGY.equals(targetFile.getParentFile().getParentFile().getName()) && targetFile.getName().endsWith(LOG_SUFFIX)) {targetFile.delete();log.info(targetFile.getName() + "前一天的日志已经删除!");//System.out.println(targetFile.getName() + "前一天的日志已经删除!");} else if (INTEGRATION.equals(targetFile.getParentFile().getName()) && LOG.equals(targetFile.getParentFile().getParentFile().getName()) && ECOLOGY.equals(targetFile.getParentFile().getParentFile().getParentFile().getName()) && targetFile.getName().endsWith(LOG)) {targetFile.delete();log.info(targetFile.getName() + "前一天的日志已经删除!");//System.out.println(targetFile.getName() + "前一天的日志已经删除!");} else {log.info("该文件夹不是"+ targetFile + ",无法删除对应日志");//System.out.println("该文件夹不是" + targetFile + ",无法删除对应日志");}} else {log.info("未生成日压缩的zip,无法删除对应日志");//System.out.println("未生成日压缩的zip,无法删除对应日志");}}
}
你会去创建一个线程去处理压缩日志并删除吗?相关推荐
- Java 创建一个线程的三种方式
Java 创建一个线程的三种方式 更多内容,点击了解: https://how2j.cn/k/thread/thread-start/353.html 创建多线程有3种方式,分别是继承线程类,实现Ru ...
- 多线程系列教材 (一)- Java 创建一个线程的三种方式
多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 步骤1:线程概念 步骤2:创建多线程-继承线程类 步骤3:创建多线程-实现Runnabl ...
- 使用Thread类和Runnable方法来创建一个线程的区别
第一:Thread类需要被继承,然后重写run()方法,但是Java中的类是单继承的,也就是说,若某个类继承Thread获取线程功能后,就不能再继承别的类了.但是Runnable接口解决了这个问题,某 ...
- 【java】创建一个线程,可以对其名称进行设置
创建一个线程,可以对其名称进行设置 package p1;public class Java_2 { public static void main(String[] args){Thread t = ...
- 多线程(一):认识和创建一个线程
认识和创建一个线程 一.进程与线程 1.进程 (1).什么是进程 (2).创建进程 2.线程 3.进程和线程的关系 4.为什么要使用多线程 二.创建一个线程 1.创建线程的方式 (1).继承Threa ...
- c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
一.Thread:线程及与线程有关的类 在 C# 语言中线程(Thread)是包含在进程中的,它位于 System.Threading 命名空间中. 与线程有关的类同样也都在 System.T ...
- 教你怎么去创建一个代币!
想知道更多关于区块链技术知识,请百度[链客区块链技术问答社区]链客,有问必答! 本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本 ...
- 线程安全list_多线程开发之如何创建一个线程安全的类
上一篇讨论了如何解决线程安全的问题,今天总结如何设计一个线程安全的类: 创建线程安全类的关注点 一个类要想线程安全,除了上一篇文章通过外部解决方式外,还可以通过合理的设计类的内部来解决,使类本身就线程 ...
- php每一个请求会创建一个线程吗,实现一个线程池
一.线程最主要的三个同步机制 1.信号量 2.互斥锁 3.条件变量 二.对三个同步机制分别实现一个包装类#ifdef LOCKER_H #define LOCKER_H #include #inclu ...
最新文章
- 优达学城《DeepLearning》2-4:自编码器(无监督学习算法)
- 旅行家的预算[贪心]
- 判断手势_手势密码有几种?
- 单元测试之JUnit 5 参数化测试使用手册
- MYSQL MVCC实现及其机制
- yii---where or该如何使用
- 因为未启用行移动功能 不能闪回表
- Java dectobin(n)函数_浙大JAVA实验题答案09answer.docx
- Kubernetes详解(十五)——Pod对象创建过程
- PowerMock简单使用
- Windows 上好用的7款下载工具
- 2019版PHP自动发卡平台源码
- 【新手基础教程】maix asr(自动语音识别)
- OSX 安装配置Maven
- 服务器后台运行程序(nohup/screen/tmux)
- Word自动给图片编号
- psql屏幕输出全部结果_液晶电视无法开机,是电源板问题还是屏幕问题,自己动手维修...
- 点云公开数据集:Semantic3D
- 动态规划-最少硬币组合问题(Java)
- revit模型怎么在手机上看_模型的查看和定位-Revit基础教程
热门文章
- “智能”基石:人工智能数据标注与训练,是决定智能时代的第一步
- 11.11大促来袭,京东如何保障云安全?
- Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
- 万字长文综述目标检测领域,你要的都在这里
- 从样本处理到决策模型,如何用NLP识别盗版资源?
- Python中的元编程:一个关于修饰器和元类的简单教程
- 为什么华为200万招聘AI博士,马斯克却推出脑机接口对抗AI?
- 【码书】一本经典且内容全面算法书籍,学算法必备
- AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”
- AI一分钟 | 美女机器人竟然想生孩子,太可怕了!比尔·盖茨当选中国工程院外籍院士