java按文件夹下日志容量大小删除部分日志
2016-05-20 23:19
579 查看
【需求】最近正在研发一款应用,属于车载定位系统的应用,运行在安卓终端设备上,安卓版本低了点,为2.3.4。
每当运行此应用,就会生成一个形如Log2016-05-20.txt 这样的文本文件,用来保存设备运行的状态信息。
关于日志有两种管理方法,一种是按日期定时删除日志。服务器通过UDP下达命令可以设置日志保留的时长,比如服务器向安卓终端设置保存日志时长为7天。而设备已连续运行了8天,自然就生成过8个这样的文本文件,但保留时长设为7天之后,就要删除7天之前的日志,即这里指的就是最早的那篇了,大家都能明白吧。
另一种管理方法为按日志保存的容量删除日志。比如当前日志有3份,分别为:Log2016-05-11.txt (日期最早,大小为5M), Log2016-05-12.txt (日期第二早,大小为6M), Log2016-0513.txt(最近日期,大小为2M) ,服务器设置日志容量大小为10MB,则每当应用初始化时,检查此文件夹下的这三个日志,前两个日志的和为:5+6=11 已经大于10M,则不计算后面的日志大小,就立即删除前两个日志,第三个日志得以保留。 如果日志大小分别为:5 ,6 , 12 ,9
。则按照需求,先删除5+6,再删除12,最后检查9<10. 最后一个得以保留。
所以,此需求就是这么变态。
于是在网上找了不少的方法与代码。自己也考虑了很多,结合网上的代码与自己的改写,有以下部分代码得以实现此功能(指的是第二种:按日志容量删除日志)
先看下工程结构:
然后直接贴代码:
Tes.java
package cn.lls;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import cn.lls.utils.FileSort;
import cn.lls.utils.TypeConvertUtil;
public class Tes {
static int dayInt;
static long fileL;
static int no = 0;
static List<Long> list2;
static long totalSize = 0;
// 递归方法
public static void deepList(File file) {
if (file.isFile() || (0 == file.list().length)) {
return;
} else {
File[] files = file.listFiles();
files = FileSort.sort(files);
for (File f : files) {
if (f.isFile()) {
String fileName = f.getName();
if (!fileName.equals("Log" + ".txt")) {
String fileDay = fileName.substring(3, 13);
System.out.println(fileDay);
Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
dayInt = (int) TypeConvertUtil.getIntervalDays(fileDay, df.format(d));
System.out.print("离今天有:" + dayInt + " 天了 ");
fileL = f.length();
list2 = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(dayInt, no);
list2.add(map.get(dayInt), fileL);
for (int i = 0; i < list2.size(); i++) {
totalSize += list2.get(i);
System.out.println("总大小:" + totalSize + " Bytes " + (totalSize / 1024 / 1024) + " MB");
if (totalSize > 12312) {
f.delete();
}
}
}
}
}
}
}
public static void main(String[] args) {
File f = new File("D:/aaa");
deepList(f);
}
}
FileSort.java
package cn.lls.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class FileSort {
/**
* 将文件数组排序,目录放在上面,文件在下面 。最主要的目的是将文件倒序
*
* @param file
* @return
*/
public static File[] sort(File[] file) {
ArrayList<File> list = new ArrayList<File>();
for (File f : file) {
if (f.isDirectory()) {
list.add(f);
}
}
for (File f : file) {
if (f.isFile()) {
list.add(f);
}
}
// 将文件倒序
Collections.sort(list, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isFile())
return -1;
if (o1.isFile() && o2.isDirectory())
return 1;
return o2.getName().compareTo(o1.getName());
}
});
return list.toArray(new File[file.length]);
}
}
运行效果:
刚开始时模拟日志都保存到了一个目录下:(模拟时请删除此文件夹下的aaa.7z这个文件,否则会出错,我这个图里忘删除了)
然后 Ctrl + F11 运行此java程序:
可以看到程序里规定日志容量大小设定为12312 bytes。
所以从离现在最远的日期开始查找文件大小的和,如果和大于此设定值,则删除这几个文件。
目的达到了。花费了好多的时间去尝试。
源代码地址:
http://download.csdn.net/detail/yukimineryuu/9526677
每当运行此应用,就会生成一个形如Log2016-05-20.txt 这样的文本文件,用来保存设备运行的状态信息。
关于日志有两种管理方法,一种是按日期定时删除日志。服务器通过UDP下达命令可以设置日志保留的时长,比如服务器向安卓终端设置保存日志时长为7天。而设备已连续运行了8天,自然就生成过8个这样的文本文件,但保留时长设为7天之后,就要删除7天之前的日志,即这里指的就是最早的那篇了,大家都能明白吧。
另一种管理方法为按日志保存的容量删除日志。比如当前日志有3份,分别为:Log2016-05-11.txt (日期最早,大小为5M), Log2016-05-12.txt (日期第二早,大小为6M), Log2016-0513.txt(最近日期,大小为2M) ,服务器设置日志容量大小为10MB,则每当应用初始化时,检查此文件夹下的这三个日志,前两个日志的和为:5+6=11 已经大于10M,则不计算后面的日志大小,就立即删除前两个日志,第三个日志得以保留。 如果日志大小分别为:5 ,6 , 12 ,9
。则按照需求,先删除5+6,再删除12,最后检查9<10. 最后一个得以保留。
所以,此需求就是这么变态。
于是在网上找了不少的方法与代码。自己也考虑了很多,结合网上的代码与自己的改写,有以下部分代码得以实现此功能(指的是第二种:按日志容量删除日志)
先看下工程结构:
然后直接贴代码:
Tes.java
package cn.lls;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import cn.lls.utils.FileSort;
import cn.lls.utils.TypeConvertUtil;
public class Tes {
static int dayInt;
static long fileL;
static int no = 0;
static List<Long> list2;
static long totalSize = 0;
// 递归方法
public static void deepList(File file) {
if (file.isFile() || (0 == file.list().length)) {
return;
} else {
File[] files = file.listFiles();
files = FileSort.sort(files);
for (File f : files) {
if (f.isFile()) {
String fileName = f.getName();
if (!fileName.equals("Log" + ".txt")) {
String fileDay = fileName.substring(3, 13);
System.out.println(fileDay);
Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
dayInt = (int) TypeConvertUtil.getIntervalDays(fileDay, df.format(d));
System.out.print("离今天有:" + dayInt + " 天了 ");
fileL = f.length();
list2 = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(dayInt, no);
list2.add(map.get(dayInt), fileL);
for (int i = 0; i < list2.size(); i++) {
totalSize += list2.get(i);
System.out.println("总大小:" + totalSize + " Bytes " + (totalSize / 1024 / 1024) + " MB");
if (totalSize > 12312) {
f.delete();
}
}
}
}
}
}
}
public static void main(String[] args) {
File f = new File("D:/aaa");
deepList(f);
}
}
FileSort.java
package cn.lls.utils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class FileSort {
/**
* 将文件数组排序,目录放在上面,文件在下面 。最主要的目的是将文件倒序
*
* @param file
* @return
*/
public static File[] sort(File[] file) {
ArrayList<File> list = new ArrayList<File>();
for (File f : file) {
if (f.isDirectory()) {
list.add(f);
}
}
for (File f : file) {
if (f.isFile()) {
list.add(f);
}
}
// 将文件倒序
Collections.sort(list, new Comparator<File>() {
@Override
public int compare(File o1, File o2) {
if (o1.isDirectory() && o2.isFile())
return -1;
if (o1.isFile() && o2.isDirectory())
return 1;
return o2.getName().compareTo(o1.getName());
}
});
return list.toArray(new File[file.length]);
}
}
运行效果:
刚开始时模拟日志都保存到了一个目录下:(模拟时请删除此文件夹下的aaa.7z这个文件,否则会出错,我这个图里忘删除了)
然后 Ctrl + F11 运行此java程序:
可以看到程序里规定日志容量大小设定为12312 bytes。
所以从离现在最远的日期开始查找文件大小的和,如果和大于此设定值,则删除这几个文件。
目的达到了。花费了好多的时间去尝试。
源代码地址:
http://download.csdn.net/detail/yukimineryuu/9526677
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories