java按文件夹下日志容量大小删除部分日志

来源:互联网 发布:2016网络知识竞赛 编辑:程序博客网 时间:2024/06/06 09:03

【需求】最近正在研发一款应用,属于车载定位系统的应用,运行在安卓终端设备上,安卓版本低了点,为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








1 0